QT_NO_DEBUG_OUTPUT 宏实现

查看 Qt 源码,可在 qlogging.h 中找到 QT_NO_DEBUG_OUTPUT 宏的定义:

#if defined(QT_NO_DEBUG_OUTPUT)
#  undef qDebug
#  define qDebug QT_NO_QDEBUG_MACRO
#endif

可以看到,当定义了 QT_NO_DEBUG_OUTPUT 宏时,Qt 首先取消先前的 qDebug 宏定义,然后将其重新定义为 QT_NO_QDEBUG_MACRO 宏:

#define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug

QT_NO_QDEBUG_MACRO 宏定义了一个永远不会执行的条件 while (false),我们可以假定[1]编译器不会解释更不会去执行 qDebug 宏后的代码。也就是说当我们关闭 qDebug 输出时,qDebug 宏后的代码是 0 编译和运行时开销的。

这是 qDebug 系列宏在 Qt5.6.3-mingw qlogging.h 中相对完整的定义:

#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug
#define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info
#define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning
#define qCritical QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).critical
#define qFatal QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).fatal

#define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug

#if defined(QT_NO_DEBUG_OUTPUT)
#  undef qDebug
#  define qDebug QT_NO_QDEBUG_MACRO
#endif
#if defined(QT_NO_INFO_OUTPUT)
#  undef qInfo
#  define qInfo QT_NO_QDEBUG_MACRO
#endif
#if defined(QT_NO_WARNING_OUTPUT)
#  undef qWarning
#  define qWarning QT_NO_QDEBUG_MACRO
#endif

  1. 现代编译器应该都可以做到。如果有误感谢您的指出。 ↩︎

posted @ 2023-03-20 15:57  邓加领  阅读(588)  评论(0)    收藏  举报