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

如何声明C99中另一个文件中定义的大小的全局数组?,c,arrays,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])}; 问题

考虑到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中相同数量的元素。但是,如果无法“外部”枚举或#定义,如何在C99中实现这一点。当然,可以在头文件中手动定义arr的元素数量,然后在其他文件中使用,但这非常不方便,因为通过更改数组arr中的元素数量,还必须手动更改此定义的值(当arr是结构数组时,这更不方便)


非常感谢您的帮助。

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

VLA对此没有帮助:它们需要是自动变量,因此不能将全局变量设为VLA。我同意valdo的观点,即拥有一个包含数组大小的全局变量(或者一个返回数组大小的函数)是正确的方法。

非常感谢您的回答。从您的建议中,我了解到使用全局常量变量或函数的帮助取决于编译器是否会优化使用整型常量替换变量或返回值,并且这些编译器标志可能根本不存在。您能告诉我可以使用哪种编译器标志吗?(我使用CodeSourcery编译器arm none eabi gcc)。非常感谢。全局
const
变量就是一个变量。这不是C++。代码>常量变量在常量表达式中无效。C语言有编译时常量的概念。最低要求是在使用点提供完整表达式,包括所有子表达式。因此,在不同转换单元中定义的常量变量不能出现在常量表达式中。这不是编译器可以选择做不同的事情。亲爱的各位,谢谢大家的意见。您能推荐任何支持这样一个预处理器标志的编译器吗?它将优化C代码,从常量int g_arrCount=sizeof(arr)/sizeof(arr[0])中扣除一个整数常量;按照瓦尔多的建议?还是从函数返回值(如Martin Lowis所建议的)?或者也许我错误地理解了他们的观点?因为在其他方面,据我所知,没有办法让C编译器做到这一点。谢谢你的澄清。即使是整个程序优化,它仍然是无效的C。