如何在 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 编译?

国产loongarch64(龙芯)GCC的初体验

如何在 KDE 上的 Qt 应用程序中禁用自动助记符?

使用 gcc 32bit 编译,作为带有 -m64 的 64 位程序

Ubuntu下的Qt5安装

在 GCC 的函数中禁用特定循环的自动矢量化