为什么只能用常量文字初始化静态变量?

时间:2020-08-02 08:49:08

标签: c

我无法理解无法使用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的声明相反,初始化发生在“主启动执行”之后。

0 个答案:

没有答案