如何在C99中声明在另一个文件中定义的全局数组?

时间:2010-12-07 12:58:16

标签: c arrays

考虑到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是一个结构数组时,这会更加不方便。)

非常感谢您的帮助。

2 个答案:

答案 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变量,而是使用其直接值。