分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功

local variable assigned to static variable;compile-error in 'c' but successful in c++

本文关键字:但在 成功 C++ 错误 静态 变量 编译 局部变量 分配      更新时间:2023-10-16

在这里,我尝试了一个程序,其中局部变量x被分配给静态变量i,并检查它是否分配了值。

用"C"编程:很明显它会给出编译时错误(初始值设定项元素不是常量(。

然后我在C++中实现了相同的程序:这次我没有收到编译时错误,而是输出为"相等"(它不应该像以前一样给出编译时错误(。

请解释一下。

int main() //C code
{
int x=10;
static int i=x;
if(i==x)
printf("Equal");
return 1;
}

int main() //C++ code
{
int x=10;
static int i=x;
if(i==x)
cout<<"equal";
return 0;
}

与C++不同,C 要求静态初始值设定项是常量。这不会用 C 语言编译,但会用C++编译:

int makeInitialValue() {
return 42;
}
static int val = makeInitialValue();

这是因为C++在为函数外部的static变量输入main之前,或者在为局部静力学输入函数之前,将要执行的特殊初始化代码插入到程序中。C 不这样做,而是要求所有static初始值设定项都是编译时常量。

引用:

C99 标准,6.7.8

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

C++11 标准,3.6.2

零初始化和常量初始化一起称为静态初始化;所有其他初始化都是动态初始化。是否使用静态存储动态初始化非局部变量是实现定义的 持续时间在 Main 的第一个语句之前完成。