如何在 Qt (gcc 64bit) 中禁用自动初始化局部变量
Posted
技术标签:
【中文标题】如何在 Qt (gcc 64bit) 中禁用自动初始化局部变量【英文标题】:How to disable automatically initialize local variable in Qt (gcc 64bit) 【发布时间】:2015-04-13 03:16:11 【问题描述】:局部变量具有未定义的初始值。但是我在 Qt (gcc 64bit) 中的代码,所有局部变量 (int, float,..) 都自动初始化为零。我不想要这个,因为不会出现一些错误。
例如:在函数中:int x;
double d;
qDebug() << "x = " << x << " d = " << d;
+) 调试版本:x = 0 d = 2.23959e-317 所有运行总是显示在结果之上。
+) 发布版本 x = 0 d = 0
我的项目是一个普通的 Qt 项目(C++ 11,我没有更改任何编译器标志)。如何在 Qt (gcc 64bit) 中关闭自动初始化局部变量
【问题讨论】:
您确定使用局部变量吗?不是全球性的。 这些变量在我的测试函数中是本地的。 好的,您使用的是什么编译器标志?是否打开了调试符号(它们也可能在发布版本中打开)?有没有开启优化?您为什么期望使用随机值进行初始化? 还有...为什么您不想在使用未初始化变量时打开警告? 我使用 QtCreator,我不更改任何编译器标志。这是制作文件:CFLAGS = -pipe -g -Wall -W -D_REENTRANT -fPIE $(DEFINES) CXXFLAGS = -pipe -g -std=c++0x -Wall -W -D_REENTRANT -fPIE $(DEFINES)。如果不初始化,我希望局部变量必须具有垃圾值。编译器可以发出警告,不需要自动将值初始化为零。 【参考方案1】:如何确定本地变量已初始化?在没有初始化的情况下使用它们只是未定义的行为,并且只会发生它们为零的情况,但您不应该依赖这一点。您可以尝试以下方法来说服自己:
#include <iostream>
int main()
int* x = new int(42);
delete x;
// it may reuse the marked-as-available memory
int* y = new int;
std::cout << *y; // often displays 42, so no zero-initialization
例如,该程序有时会重用已标记为已删除的内存。
因此,输出通常是42
,因为它恰好位于该内存位置(它恰好重用了*x
的已删除内存)。它与Qt无关。
【讨论】:
我只考虑普通的旧数据类型(int、float、double)。我编写了一个测试函数来打印局部变量的值而无需初始化。所有整型局部变量自动初始化为零,浮点型和双精度型~~ 0 ( 10^ - 317)以上是关于如何在 Qt (gcc 64bit) 中禁用自动初始化局部变量的主要内容,如果未能解决你的问题,请参考以下文章
Qt 5.1 for OSX 安装只包含 clang_64 目录,如何使用 macports gcc 编译?