C/C++条件预编译指令(宏定义)

一、宏的作用

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_WINWindows 系统
Q_OS_WIN6464 位 Windows
Q_OS_LINUXLinux 系统
Q_OS_MACmacOS 系统
Q_OS_UNIXUnix 系统(Linux/mac)
Q_OS_ANDROIDAndroid 系统
Q_OS_IOSiOS 系统

二、编译模式相关宏(调试/发布)

宏名含义
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_STRQt 版本字符串(如 "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() 判断是否定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值