C和C++中静态变量初始化的区别
C和C++中静态变量初始化的区别
我在http://geeksforgeeks.org/?p=10302浏览了这段代码。\n这段代码在C中无法编译,因为静态变量需要在main()函数开始之前进行初始化。但是在C++编译器中,这段代码可以正常编译。\n我的问题是,为什么这段代码在C++编译器中可以编译通过,因为在两种语言中,static的使用方式是相同的。当然,这两种语言的编译器肯定是不同的,但我无法确定确切的原因。如果在标准中有规定的话,我很想知道。\n我在SO上搜索了这个问题,找到了以下类似的问题:\n
- \n
- C和C++中static的区别?
- 静态变量的初始化顺序
- C和C++中的静态变量
\n
\n
\n
C语言中的静态变量需要使用在编译时已知的值进行初始化。而在C++中,去除了这个要求,你可以使用在运行时进行求值的表达式进行初始化。
这两种语言在这方面以及许多其他方面存在差异。你可以很容易地编写出C代码并被C++编译器接受,但反过来则不成立。
原因:
C语言中的静态变量必须在编译时初始化,这是由于C语言在编译时对变量进行内存分配和初始化。因此,只能使用在编译时已知的值进行初始化。而C++语言则允许在运行时进行求值的表达式进行初始化,这使得C++更加灵活。
解决方法:
如果你希望在C语言中使用在运行时进行求值的表达式进行初始化,你需要将代码转换为C++代码。这意味着你需要对代码进行一些修改,以使其符合C++语言的语法和要求。具体来说,你需要将静态变量的初始化表达式移至合适的位置,并确保它们在运行时被正确求值。
以下是一个示例代码,展示了如何在C++中初始化静态变量:
#includeusing namespace std; class Example { public: static int staticVar; }; int Example::staticVar = 10; // 在类外部进行初始化 int main() { cout << Example::staticVar << endl; // 输出:10 return 0; }
在上面的示例中,我们在类外部对静态变量进行了初始化,并在`main`函数中输出了其值。在C++中,我们可以在类外部对静态变量进行初始化,并且可以使用运行时求值的表达式。
在C语言中,静态变量的初始化表达式必须是常量表达式或字符串字面值。因此,在C中,static int i = initializer();
这行代码无法通过编译。而在C++中,没有这样的限制,所以这行代码在C++中是合法的。
那么问题来了,为什么这行代码能够在C++中编译通过呢?
原因很简单,C和C++是两种不同的语言。C语言对静态变量的初始化表达式有严格的限制,而C++则没有这样的限制。
这个问题的解决方法也很简单,如果你想在C语言中初始化静态变量,那么你需要使用常量表达式或字符串字面值作为初始化表达式。如果你想在C++中初始化静态变量,那么你可以使用任何合法的表达式作为初始化表达式。
总结起来,C和C++在静态变量的初始化上存在一些差异。在C中,初始化表达式必须是常量表达式或字符串字面值,而在C++中则没有这样的限制。
C和C++中静态变量初始化的区别
C和C++在静态变量初始化方面有所不同。C++允许在程序运行时进行动态初始化,而C则不支持这样的初始化方式(除了对于零初始化的支持)。C++之所以支持动态初始化,是因为C++需要支持具有非平凡构造函数的局部静态或非局部对象。由于C++已经具有这种复杂性,所以支持像你展示的初始化方式并不复杂。而对于C来说,这将是一个大问题,因为C没有其他原因来支持在程序启动时进行初始化(除了对于静态文件范围或局部静态对象的初始化值总是可以静态放置在可执行图像中)。C++对于段,无论是只读还是其他方面,没有任何要求,这只是你具体实现的(不太重要的)细节。
关于静态变量动态初始化的值存储问题,编译器会先给出默认值,然后在运行时将其替换为实际值。这是静态变量值不会在只读数据段的情况下的一种特殊情况。
C++支持动态初始化,因为它需要支持具有非平凡构造函数的对象,而C没有这个需求。编译器会先给出默认值,然后在运行时将其替换为实际值。C++对于段的支持与具体实现相关,而C没有这方面的要求。