Qt 4 是沒有命名空間的,從 Qt 5 開始,Qt 源碼增加了可以將所有組件編譯到命名空間 QT_NAMESPACE 的編譯選項,盡管如此,官方發(fā)布的二進制版本默認是沒有命名空間的。出于某種需要,可能有人選擇將 Qt 編譯成帶命名空間 QT_NAMESPACE 的版本。為了讓用戶代碼可以在有命名空間和沒有命名空間的 Qt 下都能編譯通過,可以在用戶代碼中添加宏 QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE。查看 Qt 源碼就可以明白這對宏的含義:
- qglobal.h 節(jié)選
#if !defined(QT_NAMESPACE) || defined(Q_MOC_RUN)
# define QT_BEGIN_NAMESPACE
# define QT_END_NAMESPACE
#else
# define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
# define QT_END_NAMESPACE }
編譯 Qt 源碼時,編譯選項 QT_NAMESPACE 將決定編譯出來的 Qt 是否帶命名空間 QT_NAMESPACE。
要查看自己的 Qt 是否是帶命名空間的,可以用類似源碼的條件判斷:
#if !defined(QT_NAMESPACE) || defined(Q_MOC_RUN)
qDebug() << "no QT_NAMESPACE";
#else
qDebug() << "QT_NAMESPACE exists";
#endif
代碼 QT_BEGIN_NAMESPACE class QLabel; QT_END_NAMESPACE
, 帶命名空間的 Qt 中被預處理為 namespace QT_NAMESPACE { class QLabel; }
,而在不帶命名空間的 Qt 中被處理為 class QLabel;
,而在絕大多數的情況下,我們獲得的 Qt 預編譯版本都是默認不帶命名空間的,所以宏QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE 往往可以將它們無視掉。為了持有帶命名空間的 Qt 的少數人,增加了 QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE 這對宏,難免讓一般用戶疑惑。但是 Qt 為了讓用戶代碼實現跨平臺構建,在有命名空間差異的 Qt 版本上都能構建成功,其作出的努力是值得肯定的。