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

C语言中预处理器上的复杂语法,c,stdout,stdin,stderr,C,Stdout,Stdin,Stderr,我试图找出C语言中的代码,我一直在努力理解预处理器的实际功能。我不理解的代码部分如下: #define ERR(source) (perror(source),\ fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\ exit(EXIT_FAILURE)) 整个代码非常简短,如下所示: #include <stdio.h> #include <stdlib.h> #include <stri

我试图找出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;
}
#包括
#包括
#包括
#定义ERR(源)(PEROR(源)\
fprintf(标准,“%s:%d\n”、\uuuuuuu文件、\uuuuu行”\
退出(退出失败)
int main(int argc,字符**argv){
字符名[22];
scanf(“%21s”,名称);
如果(strlen(name)>20)错误(“name太长”);
printf(“你好%s\n”,名称);
返回退出成功;
}

宏中的反斜杠意味着您可以像读取一行一样读取下一行,因此可以归结为:

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

希望您能理解现在正在发生的事情。

那么您在理解这个宏的哪一部分方面有困难?我不理解所有的宏。我是C语言的新手。我不知道什么是ERR,然后是下一部分(perror(source…)然后我不知道为什么会有反斜杠,然后是FILE,LINE对我来说很难理解
ERR
是宏的名称(这是代码定义的),
perror
fprintf
和所有其他东西都是C标准库的一部分,您可以在网上找到它们的定义。反斜杠只是意味着宏定义在下一行继续(因此您不必将所有内容压缩到一行)@hegendroffer:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu