使用宏在本地禁用qDebug输出

4

我在代码中使用了大量的qDebug。现在我想通过翻译单元来限制其输出,定义一个单独的宏以启用/禁用翻译单元中的qDebug输出:

test.pro:

DEFINES += NO_DEBUG_ONE

testone.cpp:

#ifdef NO_DEBUG_ONE
#define QT_NO_DEBUG_OUTPUT
#endif

testtwo.cpp:

#ifdef NO_DEBUG_TWO
#define QT_NO_DEBUG_OUTPUT
#endif

所以,我希望设置宏可以让我只在testtwo.cpp中看到qDebug输出,但是我看到了来自两个翻译单元的qDebug消息。
我错过了什么?如何解决?

1
你是否在包含 任何 Qt 头文件之前设置了这些定义? - peppe
3个回答

3

将你的代码移动到testone.cpptesttwo.cpp文件的顶部,就可以愉快地继续了。

在编译应用程序时,您可以使用QT_NO_DEBUG_OUTPUTQT_NO_WARNING_OUTPUT,但必须在Qt头文件被包含之前设置它们。

使用CMake,您可以按文件添加这些定义,但我不认为有简单的方法使用qmake进行操作。


谢谢,我终于找到时间测试它了,它的表现符合预期! - rightaway717

0

由于它是一个 QMake 宏,我认为你不能在本地做到这一点。唯一的方法是使用标准宏,如 -D TEST,然后再进行操作。

#ifndef TEST
    qDebug() << "test";
#endif

我刚刚尝试了,但没有任何区别。它将此宏传递给预处理器的方式与DEFINES相同。我在编译输出中看到了它。虽然感谢你的尝试。 - rightaway717
或者你可以使用以下宏来替换每个想要删除的QDebug:#ifndef TEST qDebug() << "test"; #endif - Gabrielle de Grimouard
那不是一个选项。我必须花费数小时或数天的工作来改变它。 - rightaway717
由于这是一个qmake宏,我认为你无法做到。该宏将用于更改Makefile而不是每个文件。 - Gabrielle de Grimouard

0
正如Gabriel de Grimouard所指出的那样,QT_NO_DEBUG_OUTPUT只在编译Qt时生效,而不是在应用程序中(据我所知)。
唯一的选择是更改您的代码,有几个选项:
  1. 按照他的答案所建议的,在每个调试之前都进行宏检查。
  2. 定义您自己的调试宏,以便您可以启用或禁用:

    // Top of testone.cpp
    #ifdef NO_DEBUG_ONE
      #define DEBUG_MESSAGE(message) 
    #else
      #define DEBUG_MESSAGE(message) qDebug() << message
    #endif
    // In your code
    DEBUG_MESSAGE("This is my debug message");
    
    • 这样做的好处是您不必在代码的各个地方都使用#ifndef TEST
  3. 利用Qt中的日志类别(推荐)

不幸的是,所有这些都需要进行代码更改。


谢谢您的回答,但请查看Simon的回答。这是可能的。 - rightaway717

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接