Сложный синтаксис над препроцессором в 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;
}
1 ответ
Обратная косая черта в макросе означает, что вы можете прочитать следующую строку, как если бы это была одна строка, поэтому она сводится к следующему:
#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;
}
Надеюсь, вы понимаете, что происходит сейчас.