分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
local variable assigned to static variable;compile-error in 'c' but successful in c++
在这里,我尝试了一个程序,其中局部变量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
具有
- 静态存储持续时间的对象的初始值设定项中的所有表达式都应是常量表达式或字符串文本。
C++11 标准,3.6.2
零初始化和常量初始化一起称为静态初始化;所有其他初始化都是动态初始化。是否使用静态存储动态初始化非局部变量是实现定义的 持续时间在 Main 的第一个语句之前完成。
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 如何让LLDB在成功时退出,在失败时等待
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 默认/样板代码在Visual Studio 2017中给我错误.E1574.虚幻.但构建成功了
- 为什么这个来自 Objective-C++ 的dynamic_cast在调试中成功但在发布时失败?
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- dll 生成成功,但在加载 dll 时执行错误
- 成功执行,但在代码厨师上上传时超出时间限制
- C++程序生成成功,但在运行时出错
- OpenCV简单代码编译成功,但在运行时崩溃
- C++ 读取注册表 使用服务失败时,但在控制台中成功
- cudaMalloc 在静态大小方面取得了成功,但在动态计算大小方面失败了
- 在代码块13.12上编译成功,但在ideone或spoj上编译错误
- 在 clang 中显式指定的参数无效,但在 gcc 中成功编译 — 谁错了?
- 计数器在运行时退出代码139,但gdb成功通过