我无法理解无法使用OUT常量文字初始化静态变量的原因。
这种初始化非常好,它可以编译:
#include <stdio.h>
int main ()
{
static int i = 15;
}
虽然不是,并且不能编译:
#include <stdio.h>
int initializer ()
{
return 15;
}
int main ()
{
static int i = initializer();
}
而且这个也没有编译:
#include <stdio.h>
int main ()
{
int x = 15;
static int i = x;
}
对于最后2个程序,编译器给出此错误:
Initializer element is not constant.
研究原因时,我提出了两种解释;一个来自https://www.geeksforgeeks.org/g-fact-80/,另一个来自C99标准5.1.2执行环境。
GeeksforGeeks指出“必须先执行所有main()
之前具有静态存储持续时间的对象,并将其初始化为初始值。因此,在转换时未知的值不能用于静态变量的初始化” 。”
C99标准规定:“具有静态存储持续时间的所有对象均应初始化(设置为它们的 初始值)。”
但是这些句子到底是什么意思?这些与常量文字有什么关系?当我在main()
函数内部声明一个静态变量作为第一个代码段时,它将进行编译,并且由于该声明位于main()
内部,因此main()
的执行已经开始。因此,与GeeksforGeeks的声明相反,初始化发生在“主启动执行”之后。