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;
}
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;
}
除了此处其他答案中说明的其他原因外,请参阅标准中的以下声明。
C 标准在第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.
在 C(与 C++ 不同)中,任何具有静态存储持续时间的对象(包括函数静态)的初始化程序必须是常量表达式。在您的示例a
中不是常量表达式,因此初始化无效。
C99 6.7.8 / 4:
具有静态存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字。
静态变量始终是全局的,因为它不在任何线程的堆栈上,它的声明是否在函数内部并不重要。
所以全局变量的初始化是在程序b
启动期间,在任何函数(包括.main
a
a
main
因此,您真的不能指望编译器接受它。
根据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;
}