2

我已阅读此考试代码。

“交流”:

int global_1 = 100;

“公元前”:

extern int global_1;
int global_2 = global_1 * 2;

int main()
{
    return 0;
}

gcc 给出“错误:初始化元素不是常量”

我不编写此代码,但我想知道为什么以及如何修复。

谢谢。

4

2 回答 2

3

您面临的问题是,为了初始化一个变量(global_2此处),它的值(或它所依赖的所有值,在您的情况下global_1)需要知道。

当你在函数中初始化一个变量时,它的值只需要在运行时知道,通常情况就是这样,否则你会在编译或链接时得到一个未定义的符号错误。

全局变量需要在编译期间由编译器初始化。

extern int global_1;

表示global_1存在的编译器,但不在此编译单元中。链接后即可访问。您可以在函数中使用它,但链接器需要先将它与实际包含它的目标文件链接。

因此编译器无法在编译时对其进行初始化,从而导致您看到的错误。链接是在编译之后进行的。

如果您需要在不同的编译单元中初始化引用全局变量的全局变量,那么您需要在函数中执行此操作。例如 中的第一个词干main()

于 2013-09-06T14:11:55.243 回答
1

错误说明了一切:初始化程序必须是常量。

要解决此问题,您可能希望像这样修改代码:

int global_2 = 0;

int main()
{
  global_2 = global_1 * 2;
于 2013-09-06T14:04:16.427 回答