--a6abdce4f86bc057 x-next-cache-tags: _N_T_/layout,_N_T_/blog/layout,_N_T_/blog/[...slug]/layout,_N_T_/blog/[...slug]/page,_N_T_/blog/c%E8%AF%AD%E8%A8%80/%E9%A2%84%E5%A4%84%E7%90%86%E5%99%A8 vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch 预处理器 | YBinary
Published on

预处理器

Authors

#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); \
  } \
}

上面示例中,替换文本放在大括号里面,这是为了创造一个块作用域,避免宏内部的变量污染外部。

宏的优点是相对简单,本质上是字符串替换,不涉及数据类型

--a6abdce4f86bc057--