我正在阅读一些C
代码并被困在这里。
您将在下面找到头文件中的代码段。
#if NUMREPS == 0
#define REPEAT(line) REPEAT0(line);
#elif NUMREPS == 16
#define REPEAT(line) REPEAT16(line);
#endif
此处定义了标识符repeat16(line);
的衍生物:
#define REPEAT16(line) \
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;\
line;
这段代码片段究竟是做什么用的? 我借助这个link来理解代码
答案 0 :(得分:6)
预处理器是在实际编译之前运行的编译过程的一个步骤。它对宏的作用就是用宏的主体替换宏调用。因此,当预处理器看到REPEAT16
的“调用”时,它将简单地用宏的参数替换它,重复16次,就像在体内一样。
参数line
正是您传递给宏的内容,因此如果您将其称为
REPEAT16(printf("hello\n"))
然后编译器看到的代码将是
printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n");
宏体中的\
字符只是告诉预处理器当前行在下一行继续。所以整个身体都是一条线。
答案 1 :(得分:4)
一行末尾的反斜杠(\
)将被预处理器替换为以下行。
这是编写多行宏定义的常用方法,因为替换文本必须位于单个“逻辑”行上,行继续用于使其更易于阅读。
这在使用宏定义整个函数时经常使用:
#define INT_RETURNER(x) int return_ ## x (void)\
{\
return x;\
}
INT_RETURNER(4711)
int main(void)
{
printf("%d!\n", return_4711());
}