前言
宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分。
C/C++ 代码编译过程 - 图片来自 ntu.edu.sg
根据用法的不同,分两种,Object-like 和 Function-like。前者用于 Object 对象,后者用于函数方法。
C/C++ 代码编译过程中,可通过相应参数来获取到各编译步骤中的产出,比如想看被预处理编译之后的宏,使用 gcc 使加上 -E 参数。
$ gcc -E macro.c
宏的定义
通过 #define 指令定义一个宏。
#define NAME_OF_MACRO value
比如,以下代码定义了一个名为 BUFFER_SIZE 的宏,指代 1024 这个数字。
#define BUFFER_SIZE 1024
使用时,
foo = (char *) malloc (BUFFER_SIZE);
使用预处理器编译:
$ gcc -E test.c
编译结果:
foo = (char *) malloc (1024);
多行
宏的定义是跟随 #define 在一同一行内的,但可通过 反斜杠 \ 实现换行从而定义出多行的宏。
多行的宏经过编译后会还原到一行中。
test.c
#include
#define GREETING_STR \
"hello \
world"
int main() { printf(GREETING_STR); }
编译后:
int main() {
printf("hello world");
return 0;
}
宏展开时的顺序
宏的展开是在处理源码时按照其出现位置进行的,如果宏定义有嵌套关系,也是层层进行展开,比如:
#include
#define GREETING_NAME "wayou"
#define GREETING "hello," GREETING_NAME