条件导数 - C中的#define

时间:2013-06-02 10:21:00

标签: c linux

我正在阅读一些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来理解代码

2 个答案:

答案 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());
}