C和C++中静态变量初始化的区别

Ano*_*non 20 c c++ static

我正在浏览http://geeksforgeeks.org/?p=10302上的代码

#include<stdio.h>
int initializer(void)
{
    return 50;
}

int main()
{
    static int i = initializer();
    printf(" value of i = %d", i);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码不会在C中编译,因为静态变量需要在main()启动之前初始化.那样就好.但是这段代码在C++编译器中编译得很好.

我的问题是,当静态在两种语言中具有相同的用法时,为什么它在C++编译器中编译.当然编译器对于这些语言会有所不同,但我无法确定原因.如果在标准中指定,我很想知道.

我在SO上搜索了这个问题,找到了3个类似的链接但是徒劳无功. Link1 Link2 Link3

谢谢你的帮助.

Joh*_*itb 10

它在C++中编译,因为无论如何C++都需要支持动态初始化,或者你不能拥有带有非平凡构造函数的本地静态或非本地对象.

因此,既然C++具有这种复杂性,那么支持你所展示的初始化并不复杂.

在C中这将是一件大事,因为C没有任何其他理由支持在程序启动时完成初始化(除了简单的零初始化).在C中,文件范围或本地静态对象的初始值始终可以静态地放入可执行映像中.


Pra*_*rav 7

6.7.8/4 [C99]

具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

static int i = initializer();RHS中不是常量表达式,因此代码不能在C中编译.

在C++中没有这样的限制,代码在C++中是格式良好的.

  • @unapersson:因为它不相关 - OP已经说"_这个代码不能用C编译.那很好.". (3认同)