2016-11-02 2 views
1

Я пытаюсь выяснить код на 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; 
} 
+2

Итак, в какой части этого макроса у вас возникли проблемы с пониманием? – UnholySheep

+0

все макрос я не понимаю. Я очень новичок в C. Я не знаю, что такое ERR, затем следующая часть (perror (source ....), тогда я не знаю, почему есть обратная косая черта, тогда __FILE __, __ LINE__ мне трудно понять – hegendroffer

+0

' ERR' - это имя макроса (это то, что определяет код), 'perror',' fprintf' и все остальные элементы являются частью стандартных библиотек C, вы можете найти их определения в Интернете. И обратная косая черта просто означает определение макроса продолжается на следующей строке (так что вам не нужно вставлять все в одну строку). – UnholySheep

ответ

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

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

+0

Спасибо, я все понял :) – hegendroffer

 Смежные вопросы

  • Нет связанных вопросов^_^