0

我正在阅读一些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;

这个代码片段究竟做了什么?我借助此链接来了解代码

4

2 回答 2

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");

宏主体中的\字符只是告诉预处理器当前行继续下一行。所以整个身体将是一条线。

于 2013-06-02T10:25:10.460 回答
4

行尾的反斜杠 ( \) 被预处理器替换为以下行。

这是编写多行宏定义的常用方法,因为替换文本必须在单个“逻辑”行上,因此使用续行使其更易于阅读。

这通常在使用宏定义整个函数时使用:

#define INT_RETURNER(x)  int return_ ## x (void)\
                         {\
                           return x;\
                         }

INT_RETURNER(4711)

int main(void)
{
  printf("%d!\n", return_4711());
}
于 2013-06-02T10:27:35.140 回答