c - 为什么编译器限制全局变量总是由常量值初始化?

标签 c

<分区>

让我举个例子,

int a = 100;
int b = a;

int main(int argc, char **argv, char ** env)
{
  printf("The value of b=%d\r\n",b);

  return 0;
}

现在,我得到了预期的编译错误。

[joshis1@localhost global_var]$ gcc global_var.c -o global_var.out
global_var.c:4:1: error: initializer element is not constant
 int b = a;
 ^

我想在这里了解的是为什么会出现错误?为什么编译器限制这个操作。 我知道初始化的全局变量存储在数据段中。编译器可以先解析 a 的值,然后再将相同的值赋给 b。为什么它缺少此功能?编译器做起来复杂吗?此功能背后是否有任何基本原理或只是 C 语言的陷阱?

最佳答案

官方文档,摘自line 1644, 6.7.8 Initialization , 说:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

为什么规则存在是一个更难的问题 - 也许正如您所说的那样,编译器很难做到。在 C++ 中,这样的表达式是有效的,但全局初始化程序可能会调用构造函数等,而对于 C,为了保持紧凑,全局变量在编译阶段进行评估。 int b = a; 可以在编译时求值,但是 int b = a + c; 呢? int b = pow(a, 2);?你会在哪里停下来? C决定不让你开始是最好的解决办法。

关于c - 为什么编译器限制全局变量总是由常量值初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19130321/

相关文章:

c - 64 位机器上的结构对齐

计算斜边的 C 程序

我可以将 int 传递给 C 中的 void 函数吗?

c++ - GLib-GObject-CRITICAL 警告

c - 让 opencv 工作(段错误)

c - 重新启动时如何阻止菜单不受控制地闪烁?

带有 header 和包含的 c 源代码

c - 在c中将数据从文件加载到数组

c - 倒带和 fseek 不起作用 - C

C程序骰子游戏