我已阅读此考试代码。
“交流”:
int global_1 = 100;
“公元前”:
extern int global_1;
int global_2 = global_1 * 2;
int main()
{
return 0;
}
gcc 给出“错误:初始化元素不是常量”
我不编写此代码,但我想知道为什么以及如何修复。
谢谢。
您面临的问题是,为了初始化一个变量(global_2
此处),它的值(或它所依赖的所有值,在您的情况下global_1
)需要知道。
当你在函数中初始化一个变量时,它的值只需要在运行时知道,通常情况就是这样,否则你会在编译或链接时得到一个未定义的符号错误。
全局变量需要在编译期间由编译器初始化。
extern int global_1;
表示global_1
存在的编译器,但不在此编译单元中。链接后即可访问。您可以在函数中使用它,但链接器需要先将它与实际包含它的目标文件链接。
因此编译器无法在编译时对其进行初始化,从而导致您看到的错误。链接是在编译之后进行的。
如果您需要在不同的编译单元中初始化引用全局变量的全局变量,那么您需要在函数中执行此操作。例如 中的第一个词干main()
。
错误说明了一切:初始化程序必须是常量。
要解决此问题,您可能希望像这样修改代码:
int global_2 = 0;
int main()
{
global_2 = global_1 * 2;