C++获取数组大小的含义

r0n*_*0ng 8 c++ arrays

这是一个获取数组大小的宏

#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的事物的指针.通过虚假的安全感来扼杀作者可能弊大于利.


Jur*_*aho 6

我认为通常(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)