宏、宏定义

发布时间:2026/8/3 19:27:05
宏、宏定义 文章目录一、定义二、宏的使用1.是或否2.二选一(1)区分操作系统的宏命令2.防止头文件重复包含的宏命令 (对于.h文件)三、必须使用宏的场景场景一条件编译跨平台 操作系统 / 开关场景二日志记录获取文件名、行号、函数名场景三Qt 框架的特殊情况对你很重要一、定义1.在文件开头定义宏#define宏名 宏值举例#definePI3.14159#defineMAX_SIZE100#defineENABLE_DEBUG// 常用于条件编译配合 #ifdef2.在某头文件里定义宏然后在文件头部#include 定义宏的头文件.h例如在version.h里写上#defineUOS_CMBC1//0:标准版本 1:民生银行UOS版本然后在其他.h或.cpp文件头部写上#includeversion.h二、宏的使用1.是或否#if宏//或者#if !宏内容#endif举例#includeiostream// 这行就像“打开开关”。如果把这行注释掉开关就关了。#defineENABLE_DEBUGintmain(){inta10;#ifdefENABLE_DEBUG// 如果上面定义了 ENABLE_DEBUG这段代码就会被保留并编译std::cout调试信息变量 a 的值是 astd::endl;#endifstd::cout程序继续运行...std::endl;return0;}2.二选一#ifdef宏//注意二选一不能出现 #ifdef !宏内容1#else内容2#endif举例需要跨平台的代码需要区分Windows和Linux操作系统区分操作系统的宏不需要自己定义系统可直接识别(1)区分操作系统的宏命令Windows的宏是WIN32注意三个字母都要大写否则无法识别。#ifdefWIN32Windows代码#elseUnix/Linux代码#endif2.防止头文件重复包含的宏命令 (对于.h文件)以LogWidget.h为例方法13行搞定是通用的宏#ifdefLogWidget_H#defineLogWidget_H内容#endif方法2 1行搞定但不通用仅限某些#pragmaonce内容三、必须使用宏的场景坚决不推荐使用尤其是宏函数但在极少数特定场景下它们依然是“不可替代”的。尽管不推荐但在以下 3 种场景宏依然是唯一解C 标准至今没有提供更好的替代品场景一条件编译跨平台 操作系统 / 开关这是你刚刚提到的 #define ENABLE_DEBUG 和 #ifdef _WIN32强烈推荐使用。这是预处理器独有的能力可以在编译前就剔除不兼容平台的代码这是普通函数做不到的。场景二日志记录获取文件名、行号、函数名如果你想打印“当前在哪个文件的哪一行出了错”必须用宏因为FILE、LINE、func这些魔法宏是由预处理器在编译时填入的。// 这种多行宏业界仍在大量使用如 spdlog、Qt 的 qDebug#defineLOG_ERROR(msg)\do{\std::cerr[__FILE__:__LINE__] msgstd::endl;\}while(0)场景三Qt 框架的特殊情况对你很重要Qt 本身大量使用了宏而且你必须配合它signals / slots / emit这些都是 Qt 定义的宏MOC元对象编译器需要它们来生成反射代码。你不能不用。Q_OBJECT这也是宏用于开启信号槽和属性系统。区别在于Qt 的宏大多用于类声明代码生成而不是用于数值计算。所以在 Qt 项目中只要遵循官方规则即可切勿自己发明复杂的计算宏。