详细介绍:宏(C++)
宏) C++ 预处理器的“宏”是编译前进行文本替换的机制,主要用 #define 来定义。
C++ 预处理器的“宏”是编译前进行文本替换的机制,主要用 #define 来定义。
1. 宏的定义方式
1.1 对象宏(常量宏)
只用来做简单文本替换。
语法:
#define 宏名 替换内容
例子:
#define PI 3.14159
#define MAX_SIZE 100
用法:
double r = 2;
double area = PI * r * r;
// 实际编译前会替换为 3.14159 * r * r
- 常量更推荐用const或constexpr
1.2 函数宏(带参数宏)
可简单模拟函数,编译前做文本替换。
语法:
#define 宏名(参数1, 参数2, ...) 替换内容
例子:
#define SQUARE(x) ((x)*(x))
#define MAX(a, b) ((a) >
(b) ? (a) : (b))
用法:
int y = SQUARE(5 + 1);
// 替换成 ((5 + 1)*(5 + 1))
int m = MAX(3, 7);
// 替换成 ((3) > (7) ? (3) : (7))
1.3 空宏(只判断是否定义)
有时只需要判断宏是否定义,无需内容:
#define DEBUG
用于条件编译:
#ifdef DEBUG
std::cout <<
"debug info" << std::endl;
#endif
2. 宏的取消(取消定义)
用 #undef 取消宏定义:
#undef PI
3. 宏的整体流程
以一次完整的使用场景为例:
步骤一:定义宏
#define DEBUG
#define PI 3.14
#define SQUARE(x) ((x)*(x))
步骤二:用宏控制代码
#ifdef DEBUG
std::cout <<
"调试信息" << std::endl;
#endif
double a = PI * 2;
int s = SQUARE(5);
步骤三:编译时预处理器做替换
- DEBUG 被定义,相关代码被保留
- PI 被替换为 3.14
- SQUARE(5) 被替换为 ((5)*(5))
步骤四:宏失效(如果用了 #undef)
#undef DEBUG
#ifdef DEBUG
// 这里不会被编译
#endif
4. 宏定义和条件编译配合使用
#define USE_FEATURE
#if defined(USE_FEATURE)
// 有新功能
#else
// 没有新功能
#endif
5. 宏的实际应用举例
- 头文件防重复包含(几乎所有C++头文件都这样)
#ifndef MY_HEADER_H
#define MY_HEADER_H
// ... 头文件内容 ...
#endif
- 平台/版本区分
#define WIN32
#if defined(WIN32)
// windows平台
#endif
- 调试/日志开关
#define DEBUG
#ifdef DEBUG
printf("log info\n");
#endif
6. 总结一条流程
- 用 #define 定义宏(可以带参数也可以不带)。
- 在代码中用宏名、或用条件编译指令如 #if defined(XXX) 判断。
- 编译时,预处理器把宏名全部替换为宏内容,或根据宏是否定义选择性保留/删除代码。
- 可用 #undef 取消宏。