c++中的宏css
#define A 3.14
展開後把A替換爲Bhtml
#define A(a) #a
展開後用a的字符串替換A(a)c++
#define A(a) a##B
展開後把a和B的字符串鏈接起來後替換A(a)git
#include "common/common.h" #define PI 3.14 #define PIPrivate 3.1415 #define foo(arg) #arg #define bar(arg) arg##Private int main(int argc, char *argv[]) { DApplication::loadDXcbPlugin(); DApplication app(argc, argv); Dtk::Util::DLogManager::registerConsoleAppender(); Dtk::Util::DLogManager::registerFileAppender(); qDebug()<<PI<<foo(PI)<<bar(PI)<<foo(bar(PI)); return 0; }
源碼地址:GitHubgithub
在Qt中,用了很多的宏。最多見的就是Q_OBJECT
markdown
Q_OBJECT
展開的最終效果以下app
public: template<typename ThisObject> inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; } _Pragma(GCC diagnostic push) static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, const char *c = Q_NULLPTR, int n = -1) { return staticMetaObject.tr(s, c, n); } static inline QString trUtf8(const char *s, const char *c = Q_NULLPTR, int n = -1) { return staticMetaObject.tr(s, c, n); } private: __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); _Pragma(GCC diagnostic pop) struct QPrivateSignal {};
下面作一步步展開Q_OBJECT
展開後以下,又有很多的宏ide
public: Q_OBJECT_CHECK QT_WARNING_PUSH Q_OBJECT_NO_OVERRIDE_WARNING static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); QT_TR_FUNCTIONS private: Q_OBJECT_NO_ATTRIBUTES_WARNING Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); QT_WARNING_POP struct QPrivateSignal {}; QT_ANNOTATE_CLASS(qt_qobject, "")
Q_OBJECT_CHECK
展開以下,宏愈來愈多了。this
template<typename ThisObject> inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; }
QT_WARNING_PUSH
和QT_WARNING_POP
展開url
#define QT_WARNING_PUSH QT_DO_PRAGMA(GCC diagnostic push) #define QT_WARNING_POP QT_DO_PRAGMA(GCC diagnostic pop)
QT_DO_PRAGMA
展開
#define QT_DO_PRAGMA(text) _Pragma(#text)
又來了新的宏_Pragma
,參考2.1.3 _Pragma操做符,就是告訴編譯器GCC diagnostic push
Q_OBJECT_NO_OVERRIDE_WARNING
展開
#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306 # define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") #else # define Q_OBJECT_NO_OVERRIDE_WARNING #endif
QT_TR_FUNCTIONS
展開,QT_DEPRECATED
展開爲空
static inline QString tr(const char *s, const char *c = Q_NULLPTR, int n = -1) { return staticMetaObject.tr(s, c, n); } QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = Q_NULLPTR, int n = -1) { return staticMetaObject.tr(s, c, n); }
Q_OBJECT_NO_ATTRIBUTES_WARNING
展開,QT_WARNING_DISABLE_GCC
展開爲空
#define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
Q_DECL_HIDDEN_STATIC_METACALL
展開,出現了__attribute__
黑魔法,參考ATTRIBUTE 你知多少?
#define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN #define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
QT_ANNOTATE_CLASS
展開爲空
#define QT_ANNOTATE_CLASS(type, ...)
參考文章
2.1.3 _Pragma操做符
ATTRIBUTE 你知多少?
源碼地址:GitHub
http://qtdream.com:1111/topic/988/qt%E5%AE%8Fq_object%E5%B1%95%E5%BC%80%E8%AE%B0%E5%BD%95/2