C++ 从glut教程了解宏测量阵列计数

C++ 从glut教程了解宏测量阵列计数,c++,arrays,opengl,macros,C++,Arrays,Opengl,Macros,我正在学习/阅读一点openGL。我目前正在学习来自的教程。该程序有一个用于数组长度的宏。我知道数组长度被计算为(sizeof(array)/(sizeof(array[0]) 但代码中还有一些附加内容,因此最后一个宏是: #define ARRAY_COUNT( array ) (sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof

我正在学习/阅读一点openGL。我目前正在学习来自的教程。该程序有一个用于数组长度的宏。我知道数组长度被计算为
(sizeof(array)/(sizeof(array[0])

但代码中还有一些附加内容,因此最后一个宏是:

#define ARRAY_COUNT( array ) (sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))))

#define ARRAY#u COUNT(ARRAY)(sizeof(ARRAY)/(sizeof(ARRAY[0])*(sizeof(ARRAY)!=sizeof(void*)| | sizeof(ARRAY[0])添加的目的是检查指针而不是数组的一些错误用法,如下所示:

long long buf[42];
long long *p = buf; 

ARRAY_COUNT(p); // this produces a compilation error : division by zero.
但它没有检测到一些不良用法,如:

char buf[42];
char *p = buf; 

ARRAY_COUNT(p); // this gives unexpected result.
该检查无法检测大小小于或等于指针的类型的错误用法

< C++ >的方式是:

template <typename T, std::size_t N>
constexpr std::size_t ArraySize(T (&)[N]) { return N; }
模板
constexpr std::size_t ArraySize(t(&)[N]){return N;}

它可以“保护”自己不被指针使用。确实如此。但是它不健壮,而且返回0没有帮助是有争议的。是的,它似乎毫无意义。如果你有一个
char*
sizeof(arr[0])