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