C 和 C++ 中静态变量初始化之间的差异

Difference between initialization of static variables in C and C++

本文关键字:之间 初始化 变量 C++ 静态      更新时间:2023-10-16

我正在浏览代码 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上搜索了这个问题,发现了这些类似的问题:

    C 中的静态
  • 和 C++ 中的静态之间的区别??
  • 静态变量初始化顺序
  • C 和 C++ 中的静态变量

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

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

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

6.7.8/4 [C99]

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

static int i = initializer(); RHS 不是一个常量表达式,因此代码不能用 C 语言编译。

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

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

这两种语言在这一点上以及许多其他方面都有所不同。您可以轻松地编写C++编译器可以接受的 C 代码,但反之则不然。