它非常有效,因为它是一个导致编译时常量的构造(C99 VLA 除外,见下文)。您可能想使用:
sizeof(array)/sizeof(array[0])
相反,因此您可以将它与非 int 类型一起使用。也许将它包装在一个宏中(当然,所有关于使用宏时要小心的常见警告都适用)。
关于更新:对于我上面的原始答案,我没有考虑 C99 中的 VLA,其中:
如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。 (6.5.3.4/2)
VLA 数组元素的数量可能只能在运行时确定(并且评估本身可能有副作用),因此对于 VLA,它不是纯粹的编译时构造。在大多数格式良好的情况下,VLA 的代码级行为实际上是相同的。例如:
#include <stdio.h>
#define countof_array(arr) (sizeof(arr)/sizeof(arr[0]))
int vlaSize(void)
{
return 8;
}
int main(void)
{
int fixed_array[9] = { 1,2,3,4,5,6,7,8,9 };
int vla_array[vlaSize()];
printf("Fixed array: size = %zu bytes, count = %zu elements\n",
sizeof(fixed_array), countof_array(fixed_array));
printf("VLA array: size = %zu bytes, count = %zu elements\n",
sizeof(vla_array), countof_array(vla_array));
return 0;
}
结果:
$ gcc -Wall -std=c99 so-misc.c
$ ./a.out
Fixed array: size = 36 bytes, count = 9 elements
VLA array: size = 32 bytes, count = 8 elements
在进一步编辑时,删除这部分:
警告:故意创建一个案例并不难,其中countof_array 的语义对于 VLA [...]
因为再想一想,我不确定这是否属实。在separate question 中询问这个问题。
无论如何,它仍然非常高效,因为首先要创建 VLA,编译器必须弄清楚 VLA 将占用多少空间。因此,即使不是 VLA 的编译时常量,它仍然是确定数组大小的最有效方法。