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_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() 判断是否定义

你可能感兴趣的:(c语言,c++,开发语言)