Visual C ++ 10随stdlib.h一起提供,其中包含此gem:
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 :(得分:14)
从here
引用STL我做了这个改变;我通常不会攻击CRT,但这个是 不重要的。 + 0使一个虚假的“警告C6260:sizeof * sizeof 通常是错的。您打算使用字符计数还是字节 当有人写_countof(arr)* sizeof(T)时,来自/分析。
答案 1 :(得分: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)))
[P.S。:将此视为评论]