我试图找出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;
}
答案 0 :(得分:3)
宏中的反斜杠意味着您可以读取下一行,就好像它是一行一样,所以归结为:
#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;
}
希望您了解现在发生的事情。