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
现代编译器应该都可以做到。如果有误感谢您的指出。 ↩︎
禁止转载,如果需要你可以添加引用或链接。
理由:我认为由于恣意转载,现在国内的技术博客充斥着大量的重复内容,有些甚至是错误的,这不利于技术探索。
理由:我认为由于恣意转载,现在国内的技术博客充斥着大量的重复内容,有些甚至是错误的,这不利于技术探索。

浙公网安备 33010602011771号