2012-03-13 6 views
8

विजुअल C++ 10 stdlib.h अन्य बातों के अलावा इस रत्न शामिल हैं के साथ भेज दिया जाता है:इस "तत्वों की संख्या" मैक्रो में डमी के अतिरिक्त उद्देश्य क्या है?

template <typename _CountofType, size_t _SizeOfArray> 
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; 

#define _countof(_Array) (sizeof(*__countof_helper(_Array)) + 0) 

जो का उपयोग करता है a clever template trick to deduce array size और __countof में पारित किया जा रहा से संकेत को रोकने के।

मैक्रो परिभाषा में + 0 का उद्देश्य क्या है? यह किस समस्या को हल करता है?

+0

[पी एस यह एक टिप्पणी के रूप में विचार करें] केवल एक चीज जिसे मैं सोच सकता हूं वह इसे टेम्पलेट विशेषज्ञता में प्रयोग करने योग्य बना रहा है। हालांकि यह एक सीमा है। – Pubby

+0

बेशक, यदि वीएस -2010 ने 'constexpr' का समर्थन किया है तो यह होगा: 'टेम्पलेट <टाइपनाम टी, आकार_टी एन> constexpr size_t आकार (टी (और) [एन]) {वापसी एन; } ' –

उत्तर

14

से here

एसटीएल का हवाला देते हुए मैं यह बदलाव किया है; मैं आमतौर पर सीआरटी को हैक नहीं करता हूं, लेकिन यह छोटा था। + 0 एक नकली "चेतावनी C6260: आकार * आकार आमतौर पर गलत है। क्या आप एक चरित्र गणना या बाइट गिनती का उपयोग करना चाहते थे?" जब कोई लिखता है/विश्लेषण करता है तो _countof (arr) * sizeof (T)।

2

मैक्रो परिभाषा में + 0 का उद्देश्य क्या है? क्या समस्या हल करता है?

मुझे नहीं लगता कि यह किसी भी समस्या का समाधान करता है। इसका इस्तेमाल किसी अन्य उत्तर में उल्लिखित कुछ चेतावनी को चुप करने के लिए किया जा सकता है।

महत्वपूर्ण नोट पर, निम्नलिखित संकलन समय पर सरणी आकार पाने की एक और तरीका है (व्यक्तिगत रूप से मैं इसे अधिक पठनीय लगता है):

template<unsigned int SIZE> 
struct __Array { char a[SIZE]; } 

template<typename T, unsigned int SIZE> 
__Array<SIZE> __countof_helper(const T (&)[SIZE]); 

#define _countof(_Array) (sizeof(__countof_helper(_Array))) 

:

+0

खराब पहचानकर्ता नाम ... खराब पहचानकर्ता नाम! – Xeo

+0

@Xeo, माना जाता है कि इसका उपयोग लाइब्रेरी कोड (ओपी) के लिए किया जाता है, जिसमें पहले से ही '__' और '_' कैप्स के बाद होता है। प्रश्न में स्रोत से कॉपी किया गया। – iammilind

+0

@iammilind: मुझे यह और भी पठनीय लगता है, हालांकि वीएस तरीके के बारे में अच्छी बात यह है कि यह एक नकली 'संरचना 'पेश करने से बचाता है। –

संबंधित मुद्दे