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

时间:2011-05-07 15:12:47

标签: 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;
}

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

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:7)

6.7.8 / 4 [C99]

  

具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为   常量表达式或字符串文字。

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

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

答案 2 :(得分:3)

C中的静态变量需要使用编译时已知的值进行初始化。此要求已在C ++中删除,您可以使用在运行时评估的表达式初始化它们。

这两种语言在这方面以及许多其他方面都有所不同。你可以很容易地编写C ++编译器可以接受的C代码,但事实并非如此。