这是一个获取数组大小的宏
#define array_size(array) \
(sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*)))
Run Code Online (Sandbox Code Playgroud)
我认为通常(sizeof(array)/(sizeof(array [0]))足以获得数组的大小.
我想这部分
(sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))
Run Code Online (Sandbox Code Playgroud)
是为了避免将整个事物除以零,任何人都可以帮忙解释一下?
提前致谢.
干杯,
Dan*_*her 12
乘以sizeof array[0]
除数
(sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))
Run Code Online (Sandbox Code Playgroud)
如果,除数为零
sizeof array == sizeof(void*)
Run Code Online (Sandbox Code Playgroud)
和
sizeof array[0] > sizeof(void*)
Run Code Online (Sandbox Code Playgroud)
在这些情况下,在编译期间会得到除零,这会导致编译失败.
这些检查试图检测作为指针的参数(它们是否是数组到指针转换的结果),因为人们无法通过使用该商来知道指针指向的"数组"有多大.
如果其他指针类型的大小不同void*
,则它会失败,并且它不会检测指向不大于void*
s的事物的指针.通过虚假的安全感来扼杀作者可能弊大于利.
我认为通常(sizeof(array)/(sizeof(array [0]))足以获得数组的大小.
虽然这不是你的主要问题,但你提到了它.在C++中确定数组大小的正确方法是使用模板:
template<typename T, size_t size>
constexpr size_t array_size(T(&)[size]){
return size;
}
Run Code Online (Sandbox Code Playgroud)