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

http://qtdream.com:1111/topic/988/qt%E5%AE%8Fq_object%E5%B1%95%E5%BC%80%E8%AE%B0%E5%BD%95/2

Qt宏Q_OBJECT展开记录的更多相关文章

  1. QT宏 Q_OBJECT,explicit, QHostAddress, quint, emit

    QT相關 一. 參考: 1.宏Q_OBJECT 二. explicit struct constrcution 三. QHostAddress Detailed Description: The QH ...

  2. C\C++语言中的宏多重展开和递归展开

    宏定义中的#,## 1. 宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组     2.记号粘贴操作符(token paste operator): ##            “## ...

  3. Qt开发的应用记录读取用户习惯设置的方法

    Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...

  4. Qt编写软件运行时间记录(开源)

    在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编 ...

  5. Qt 安装与配置记录

    一 安装的时候得选一个Qt安装啊!!不要忘了展开这一项,而只安装Qt creator 展开之后会发现有很多版本,为了方便,选自带编译器mingw,就不需要麻烦的配置了 二 打开Qt creator 后 ...

  6. Qt 格式转换问题 记录(好多方法)

    用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QString转为Char * QString *str; char *a; str="hello word ! ...

  7. [转载][QT][SQL]sql学习记录6_sqlite Autoincrement(自动递增)

    转载自:定义以及示例请见 : http://www.runoob.com/sqlite/sqlite-autoincrement.html SQLite Autoincrement(自动递增) SQL ...

  8. [转载][QT][SQL]sql学习记录5_sqlite视图(View)

    转载自:http://www.runoob.com/sqlite/sqlite-view.html SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLi ...

  9. [转载][QT][SQL]sql学习记录4_sqlite约束

    转载自:定义以及示例请见 : http://www.runoob.com/sqlite/sqlite-constraints.html SQLite 约束 约束是在表的数据列上强制执行的规则.这些是用 ...

随机推荐

  1. 【搭建RAC报错】搭建RAC,第二个节点执行root.sh报错:CRS-2800、CRS-4000

    Creating /etc/oratab file...Entries will be added to the /etc/oratab file as needed byDatabase Confi ...

  2. AWK高端功能-数组

    第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...

  3. Nopcommerce主要用到的技术及特点

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  4. Python语言简介以及特点

    编程语言的分为编译型语言和解释型语言: 1. 编译型语言: (1) 编译型语言的代表:C.C++.Delphi等, (2) 编译型语言的运行方式:编译 -> 运行 (3) 编译型语言的优缺点分析 ...

  5. LR测试报告分析 -详解

    1. 结果摘要 LoadRunner进行场景测试结果收集后,首先显示的该结果的一个摘要信息,如下图所示.概要中列出了场景执行情况.“Statistics Summary(统计信息摘要)”.“Trans ...

  6. 在server 2003中搭建域服务(Http NTLM 代理)

    在server 2003中搭建域服务(Http NTLM 代理) 在windows server 2003 X64中搭建域服务的操作. 可参考百度经验:http://www.cnblogs.com/z ...

  7. 网页从url到网页展示到页面的流程

    心血来潮整理的 https://mubu.com/doc/oLDc49lx39

  8. MAC node + git + bower 简单安装

    一 node 安装 打开https://nodejs.org/en/ nodejs官网 下载安装文件 双击.pkg 文件 自动安装即可 二 安装git 打开 http://code.google.co ...

  9. js 的filter()方法

    filter()方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组. filter()基本语法: arr.filter(callback[, thisArg]) filter() ...

  10. Dao DaoImp

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...