- Published on
预处理器
- Authors
- Name
- Yanbin
- @ybtaimu
#define
#define
是最常见的预处理指令,用来将指定的词替换
成另一个词。它的参数分成两个部分,第一个参数就是要被替换的部分,其余参数是替换后的内容。每条替换规则
,称为一个宏(macro)
。
#define MAX 100
上面示例中,#define指定将源码里面的MAX,全部替换成100。MAX就称为一个宏。
宏是原样替换
,指定什么内容,就一模一样替换成什么内容,区别于函数
。
1.带参数的宏
宏的强大之处在于,它的名称后面可以使用括号,指定接受一个或多个参数。
#define SQUARE(X) X*X
这种写法很像函数,但又不是函数
,而是完全原样的替换,会跟函数有不一样的行为。
#define SQUARE(X) X*X
// 输出19
printf("%d\n", SQUARE(3 + 4));
面示例中,SQUARE(3 + 4)
如果是函数,输出的应该是49(7*7
);宏是原样替换,所以替换成3 + 4*3 + 4
,最后输出19。
如果宏的长度过长,可以使用反斜杠(\)折行,将宏写成多行
。
#define PRINT_NUMS_TO_PRODUCT(a, b) { \
int product = (a) * (b); \
for (int i = 0; i < product; i++) { \
printf("%d\n", i); \
} \
}
上面示例中,替换文本放在大括号里面,这是为了创造一个块作用域,避免宏内部的变量污染外部。
宏的优点是相对简单,本质上是字符串替换
,不涉及数据类型