C语言预处理器的复杂语法

A complicated syntax over preprocessor in C

我试图弄清楚 C 中的代码,但我一直在试图理解预处理器部分的实际作用。我不明白的代码部分如下:

#define ERR(source) (perror(source),\
         fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
         exit(EXIT_FAILURE))

整个代码很短,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERR(source) (perror(source),\
             fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
             exit(EXIT_FAILURE))

int main(int argc, char** argv) {
    char name[22];
    scanf("%21s",name);
    if(strlen(name)>20) ERR("Name too long");
    printf("Hello %s\n",name);
    return EXIT_SUCCESS;
}

宏中的反斜杠意味着你可以像阅读一行一样阅读下一行,所以归结为:

 #define ERR(source) (perror(source), fprintf(stderr,"s:%d\n",__FILE__,__LINE__), exit(EXIT_FAILURE))

一个#define预处理器语句用于用其他代码替换代码,例如

#define SOMECONSTANT 5
在编译代码之前,

会将代码中的 SOMECONSTANT 替换为 5。预处理器还理解类似函数的语法,这就是你在这里所拥有的。

您的宏产生以下主体:

int main(int argc, char** argv) {
    char name[22];
    scanf("%21s",name);
    if(strlen(name)>20) (perror("Name too long"), fprintf(stderr,"s:%d\n",__FILE__,__LINE__), exit(EXIT_FAILURE));
    printf("Hello %s\n",name);
    return EXIT_SUCCESS;
}

您案例中的宏使用逗号运算符将几条语句放在一起,因此您可以将它作为一条语句使用。通常,您的代码会写成:

int main(int argc, char** argv) {
    char name[22];
    scanf("%21s",name);
    if(strlen(name)>20) {
          perror("Name too long");
          fprintf(stderr,"s:%d\n",__FILE__,__LINE__);
          exit(EXIT_FAILURE);
    }
    printf("Hello %s\n",name);
    return EXIT_SUCCESS;
}

希望你明白现在发生了什么。