C/C++宏
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:201
- 发布: 2025-06-13 20:36
- 最后更新: 2025-06-13 20:36
概述
程序的生成过程:
- 预编译(处理宏。.i或者.ii 文件)
- 编译(元编程代码处理,模板的实例化,其他代码的编译。.s文件)
- 汇编(汇编语言代码处理,生成二进制目标文件。.o文件)
- 链接(将编译生成的符号,跟定义进行合并,可执行文件)
在程序预处理阶段将宏替换成定义的内容。本质是内容的替换。
常用指令
| 指令 | 说明 |
|---|---|
| #include | 包含一个源文件代码 |
| #define, #undef | 定义/取消一个宏 |
| #ifdef , #ifndef | 如果宏(没有)定义,返回真,并开始一个条件编译块 |
| #if, #else, #elif | 定义一个条件编译块 |
| #endif | 结束一个条件编译块 |
| #error | 输出错误消息,编译会中断 |
| #pragma | 可向编译器发出特殊命令,控制编译 |
用法
- 通常为大写
- 通常作为静态配置参数,可以让编译好的程序有不同的行为
- 宏和条件编译配合,可以静态调整程序模块,逻辑流程等。
- 参数宏是代码替换,可能引起二进制代码的体积增大。
- 配合预定义,可以实现很灵活的功能。
基本参数定义
宏函数
特殊符号定义
#:字符串化操作符(Stringizing Operator)
字符串化操作符,将宏参数转换为一个字符串。通常在预编译时候,生成包含宏参数值的字符串。
c
#define TO_STRING(STR) #STR
##:连接符(Token-Pasting Operator)
##符号用于连接两个标记(token)成一个标记。这在宏定义中特别有用,它允许你创建具有动态名称的变量或者函数。
c
#define CONCAT(X, Y) X##Y
int CONCAT(part1, part2) = 42; // int part1part2 = 42;
#@:字符化操作符(Charizing)
作用:将传入单字符参数名转换成字符,以一对单引用括起来。
c
#define CHAR(C) #@C
char ch = CHAR(T); // char ch = 'T';
\:续行符号
当定义的宏不能用一行表达完整时,可以用\表示下一行继续此宏的定义。注意\前留空格。
c
#define EXAMPLE \
example