Сложный синтаксис над препроцессором в 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;
}

Надеюсь, вы понимаете, что происходит сейчас.

Другие вопросы по тегам