当我在
行运行此程序时,我得到ERROR
static int b = a; //error : initializer element is not constant
无法理解为什么?
#include <stdio.h>
// #include <setjmp.h>
int main()
{
int a = 5;
static int b = a;
return 0;
}
答案 0 :(得分:3)
除了此处其他答案中陈述的其他原因外,请参阅标准中的以下声明。
C Standard在Point-4(第6.7.8节初始化)中说明了这一点:
All the expressions in an initializer for an object that has static storage duration
shall be constant expressions or string literals.
此外,关于什么是常量表达式,它在第6.6节“常量表达式”中说明如下:
A constant expression can be evaluated during translation rather than runtime, and
accordingly may be used in any place that a constant may be.
答案 1 :(得分:2)
在C语言中(与C ++不同),具有静态存储持续时间的任何对象的初始化程序(包括函数静态)必须是常量表达式。在您的示例中,a
不是常量表达式,因此初始化无效。
C99 6.7.8 / 4:
具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
答案 2 :(得分:1)
静态变量总是全局的,因为它不在任何线程的堆栈上,如果它的声明在函数内部并不重要。
因此,在调用任何函数(包括b
)之前,在程序启动期间执行全局变量main
的初始化,即当时不存在a
,因为a
是局部变量,在调用函数(此处main
)后将其内存放在堆栈上。
因此,你真的不能指望编译器接受它。
答案 3 :(得分:0)
根据Als的回答......
// This is really crappy code but demonstrates the problem another way ....
#include <stdio.h>
int main(int argc, char *argv[])
{
static int b = argc ; // how can the compiler know
// what to assign at compile time?
return 0;
}