【发布时间】:2013-10-08 10:44:05
【问题描述】:
让我举例说明,
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 的一个陷阱?
【问题讨论】:
-
错误信息就是你的答案。
-
那么,编译器应该如何在函数外部运行可执行代码(计算表达式)? C++ 编译器可以做到这一点,但这通常是通过创建一些在
main()之前运行的辅助函数来工作的,这是丑陋的、hackish、隐式和隐藏的,所以你的程序并没有真正按照你的想法去做,而 C 程序员不喜欢那样。 (C++ 程序员会这样做。) -
编译器是编译器而不是解释器
-
@GrijeshChauhan 不适用。 OP 知道他为什么会出错,他正在寻找其背后的设计决策。
-
@H2CO3 评估初始化程序的值,并将其作为 b 的初始化程序存储在数据中 - 我相信这就是 Joshi 想要的。但是有些东西阻止了这一点(我很高兴它是)。运行时评估是不可能的。我已经摆脱了这些烦人且严重的误解。
标签: c