宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分。
C/C++ 代码编译过程 - 图片来自 ntu.edu.sg
根据用法的不同,分两种,Object-like 和 Function-like。前者用于 Object 对象,后者用于函数方法。
C/C++ 代码编译过程中,可通过相应参数来获取到各编译步骤中的产出,比如想看被预处理编译之后的宏,使用 gcc
使加上 -E
参数。
小编推荐一个学C/C++的学习裙【五八九,三四八,三八九】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有很多干货和技术分享!
$ 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
在一同一行内的,但可通过 反斜杠 \
实现换行从而定义出多行的宏。
#include <stdio.h> #define GREETING_STR \ "hello \ world" int main() { printf(GREETING_STR); return 0; }
多行的宏经过编译后会还原到一行中。
test.c
#include <stdio.h> #define GREETING_STR \ "hello \ world" int main() { printf(GREETING_STR); }
编译后:
int main() { printf(&