一、宏的作用
WHAT:编译器会在正式编译之前,根据条件来选择性地编译部分代码。
其实,可以简单理解为利用宏定义控制代码段。
比如:我在Linux平台,我要执行操作A,在Windows平台,我要执行操作B,利用宏定义就可以了。
比如:跨平台
#ifdef Q_OS_WIN
qDebug() << "Windows 平台";
#elif defined(Q_OS_LINUX)
qDebug() << "Linux 平台";
#elif defined(Q_OS_MAC)
qDebug() << "macOS 平台";
#endif
二、宏的使用
定义宏
--宏定义--
DEFINES += MY_MACRO # 等价于:#define MY_MACRO
DEFINES += MY_MACRO=123 # 等价于:#define MY_MACRO 123
DEFINES += MY_STRING=\"abc\" # 等价于:#define MY_STRING "abc"
使用宏
#ifndef FEATURE_CUSTOM
qDebug() << "该输出不会在 QT_NO_DEBUG_OUTPUT 定义时出现";
#endif
一定要注意:
程序员自定义宏和QT编译器定义的宏!!
自定义宏一定在.pro文件中添加宏定义或手动通过 #define
定义宏
.pro
DEFINES += FEATURE_CUSTOM
三、常用的宏
一、平台相关宏(操作系统)
宏名 | 含义 |
---|---|
Q_OS_WIN | Windows 系统 |
Q_OS_WIN64 | 64 位 Windows |
Q_OS_LINUX | Linux 系统 |
Q_OS_MAC | macOS 系统 |
Q_OS_UNIX | Unix 系统(Linux/mac) |
Q_OS_ANDROID | Android 系统 |
Q_OS_IOS | iOS 系统 |
二、编译模式相关宏(调试/发布)
宏名 | 含义 |
---|---|
QT_DEBUG | 当前为 Debug 模式构建 |
QT_NO_DEBUG | 当前为 Release 模式构建 |
QT_NO_DEBUG_OUTPUT | 禁用 qDebug() 输出(适合发布) |
三、Qt模块启用/禁用宏
宏名 | 含义 |
---|---|
QT_NO_OPENGL | 未启用 OpenGL 支持 |
QT_NO_DEBUG_OUTPUT | 禁用 qDebug() 输出 |
QT_NO_NETWORKPROXY | 禁用网络代理模块 |
QT_NO_TRANSLATION | 不支持翻译功能 |
四、Qt 本身的版本宏
宏名 | 含义 |
---|---|
QT_VERSION | 当前 Qt 版本(十六进制) |
QT_VERSION_STR | Qt 版本字符串(如 "6.5.2") |
解惑:
“为什么不用函数判断当前平台,而要使用宏定义?”
宏定义在在编译阶段就会判断是否编译某段代码,不需要实际执行程序。
所以,更建议使用宏定义,而非函数。
“宏支持条件判断或运算吗?”
支持
比如:
#if VERSION_CODE >= 40
#if VERSION_CODE >= 40 && VERSION_CODE <= 70
#if VERSION_CODE >= 1000 || VERSION_CODE <= 70
#ifndef USE_FEATURE (取反)
#if defined(USE_FEATURE) 使用
defined()
判断是否定义