用于计算数组中元素数量的经典宏是:
#define countof(a) (sizeof(a) / sizeof(*(a)))
Run Code Online (Sandbox Code Playgroud)
这个问题是如果参数是指针而不是数组,它会无声地失败.是否有一种可移植的方法来确保此宏仅与实际数组一起使用,如果a不是数组则生成编译时错误?
编辑:我的问题似乎是这个问题的重复:拒绝指针的数组大小的宏
使用非可移植内置函数,这是一个执行静态断言的宏,它a是一个数组:
#define assert_array(a) \
(sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1)
Run Code Online (Sandbox Code Playgroud)
它适用于gcc和clang.我用它来使countof()宏更安全:
#define countof(a) (sizeof(a) / sizeof(*(a)) + assert_array(a))
Run Code Online (Sandbox Code Playgroud)
但我没有这个问题的便携式解决方案.