使用宏在本地禁用 qDebug 输出

Disable qDebug output locally with a macro

我在整个代码中都使用了 qDebug。现在我想通过翻译单元限制它的输出,定义一个单独的宏到翻译单元中的 enable/disable 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 消息。

我在这里遗漏了什么以及如何解决它?

由于它是一个 QMake 宏,我认为您不能在本地执行。唯一的方法是使用标准宏作为 -D TEST 然后做这样的事情。

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

正如 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中的Logging Categories(推荐)

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

将您的代码移至 testone.cpptesttwo.cpp 的顶部,您应该可以开始了。

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

使用 cmake,您可以在 per-file 基础上添加这些定义,但我没有看到使用 qmake 进行此操作的简单方法。