美文网首页Qt学习C++
Qt宏Q_OBJECT展开记录

Qt宏Q_OBJECT展开记录

作者: b0542f6c4d28 | 来源:发表于2017-08-20 11:40 被阅读191次

c++中的宏

#define A 3.14 展开后把A替换为B

#define A(a) #a 展开后用a的字符串替换A(a)

#define A(a) a##B 展开后把a和B的字符串连接起来后替换A(a)

#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;
}

源码地址:GitHub

在Qt中,用了不少的宏。最常见的就是Q_OBJECT

Q_OBJECT展开的最终效果如下

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展开后如下,又有不少的宏

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展开如下,宏越来越多了。

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_PUSHQT_WARNING_POP展开

#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

相关文章

  • Qt宏Q_OBJECT展开记录

    c++中的宏 #define A 3.14 展开后把A替换为B #define A(a) #a 展开后用a的字符串...

  • 窗口部件常用接口

    所有定义了信号槽的类,都要在头部加 Q_OBJECT。这是一个宏,singals和slots也是宏。 QT的各个模...

  • Qt undefined reference to `vtabl

    原因:QT中,类要支持信号与槽机制,需要继承自QObject并在头文件开头添加Q_OBJECT宏.如果使用QtCr...

  • Q_OBJECT宏

    徐红伟@百香果科技 Q_OBJECT宏必须出现在那些想要定义自己的信号(Signal)和槽(Slot)的类的pri...

  • Mac Qt Q_OBJECT报错

    1. undefined reference to vtable fot xxx 如果是加上Q_OBJECT导致报...

  • Qt中各个系统的宏定义

    Qt中各个系统的宏定义

  • Qt QStringLiteral 宏

    Qt 为我们提供了 QStringLiteral(str) 宏 使用 QStringLiteral 宏可以在编译期...

  • Qt自定义信号槽

    自定义信号槽 关于Q_OBJECT宏 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必...

  • QT5编程系列 (1)Q_OBJECT

    只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObjec...

  • QT Creator 4.7.0 + QT 5.9.6 项目问题

    QT Creator 4.7.0 + QT 5.9.6 项目问题记录与解决 问题:对QT中窗口Widget设置背景...

网友评论

    本文标题:Qt宏Q_OBJECT展开记录

    本文链接:https://www.haomeiwen.com/subject/vdkfdxtx.html