【问题标题】:Difference between initialization of static variables in C and C++C和C++中静态变量初始化的区别
【发布时间】:2011-05-07 15:12:47
【问题描述】:

我正在查看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++ 编译器中编译得很好。

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

我在 SO 上搜索了这个问题,发现了这些类似的问题:

【问题讨论】:

    标签: c++ c static


    【解决方案1】:

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

    因此,既然 C++ 无论如何都具有这种复杂性,那么像您展示的那样支持初始化就不再复杂了。

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

    【讨论】:

    • 谢谢。我正在寻找类似的东西。所以当我们有 --- static char *p = "lol" ; lol 位于数据段的只读区域,而 p 位于读写区域。现在,当有动态初始化时,编译器如何知道运行时的值?我想这本身可能需要另一个问题,所以要点就可以了。
    • @Anon 我不明白你的问题。它应该知道什么值?
    • 我的错。我不够清楚。基本上我想知道编译器在动态初始化静态变量时将它们存储为静态变量的值。经过一番谷歌搜索,我找到了答案。感谢您及时为我指明正确的方向。 (对于那些想知道答案的人 - 编译器将首先给出默认值,然后在运行时将值替换为实际值。所以这是静态变量的值不会出现在数据段的只读部分)
    • @Anon 它的值将是程序启动和动态初始化开始之间的空指针。见stackoverflow.com/questions/3309042/what-does-main-return
    • @Anon C++ 对段没有什么可说的,不管是只读的还是其他的。这是您具体实现的一个(不是很有趣的)细节。
    【解决方案2】:

    6.7.8/4 [C99]

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

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

    在 C++ 中没有这样的限制,并且代码在 C++ 中格式正确。

    【讨论】:

    • 问题是为什么它在 C++ 中编译。
    • @Blagovest Buyukliev 主要是因为它是一种不同的语言
    • @unapersson:因为它不相关 - OP 已经说“此代码不会在 C 中编译。没关系。”。
    • @Blagovest -- 问题是Difference between initialization of static variables in C and C++,所以显示不同之处的答案似乎特别相关......
    【解决方案3】:

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

    这两种语言在这一点以及许多其他方面都不同。你可以很容易地编写 C++ 编译器可以接受的 C 代码,但反过来就不行了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多