C 和 C++ 中静态变量初始化之间的差异
Difference between initialization of static variables in C and C++
我正在浏览代码 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 代码,但反之则不然。
相关文章:
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 不同的类或结构初始化方法之间的性能差异是什么?
- p_threads初始化中向量和数组之间的区别
- 这些初始化之间有什么区别?
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 直接列表初始化和复制列表初始化之间的差异
- 使用 double 在 C++ 中初始化 int 之间的差异
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 如何以包装的方式初始化布局,从而减少布局之间的空间
- 为什么在初始化 C 和 C++ 之间的全局变量时会有这种差异?
- 无效指针和非初始化的指针之间的差异
- 各种初始化和构造之间的关系
- 这些在C 中初始化C数组的方式之间有区别吗?
- 结构和类之间的C 差异VS2015中的初始化
- 对象的动态数组 - 初始化方法之间的差异
- 均衡符号和初始化之间的时间和空间复杂性是否存在差异
- 显式强制转换、直接初始化和复制初始化之间的行为不同
- 分配列表和初始化器列表之间 C++11 缩小的差异
- 在 c++ 中大括号 {} 和 {0} 之间的初始化差异
- 这两个初始化之间有什么区别