考虑到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])};
问题是,在同一个项目的其他文件中,我想在全局范围内再次创建其他数组,其元素数量与arr相同。但是,如果没有办法'extern'枚举或#define,怎么能在C99中实现这一点。当然,可以在头文件中手动#define arr元素的数量,然后在其他文件中使用它,但这非常不方便,因为通过更改数组中的元素数量,一个人也必须手动更改这个#define的值(当arr是一个结构数组时,这会更加不方便。)
非常感谢您的帮助。
答案 0 :(得分:2)
VLA没有帮助:它们需要是自动变量,因此您不能将全局变量设为VLA。我同意valdo有一个包含数组大小的全局变量(或者是一个返回它的函数)是正确的方法。
答案 1 :(得分:0)
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;
如果您使用整个程序优化选项 - 很可能完全省略g_arrCount
变量,而是使用其直接值。