考虑到VLA(可变长度数组),我想问一下您对以下问题的看法:如果在一个文件中在全局范围内定义了一个数组:
int arr[] = {1, 2, 3};
// in the same file it is no problem to obtain the number of elements in arr by
#define arr_num sizeof(arr)/sizeof(arr[0])
// or
enum {arr_num = sizeof(arr)/sizeof(arr[0])};
Run Code Online (Sandbox Code Playgroud)
问题是,在同一个项目的其他文件中,我想在全局范围内再次创建其他数组,其元素数量与arr相同.但是,如果没有办法'extern'枚举或#define,怎么能在C99中实现这一点.当然,可以在头文件中手动#define arr元素的数量,然后在其他文件中使用它,但这非常不方便,因为通过更改数组中的元素数量,一个人也必须手动更改这个#define的值(当arr是一个结构数组时,这更加不方便).
非常感谢您的帮助.
AFAIK 根据 C99 你不能这样做。因为所有的翻译模块都是以独立的方式编译的,而sizeof应该在编译时就知道。
你可以这样做:
int arr[] = {1, 2, 3};
const int g_arrCount = sizeof(arr)/sizeof(arr[0]);
// other translation unit
extern const int g_arrCount;
Run Code Online (Sandbox Code Playgroud)
如果您使用整个程序优化选项 - 很可能该g_arrCount变量将被完全省略,而是将使用其直接值。