2016-11-02 3 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 (근원 ....))을 알지 못한다. 그런데 백 슬래시가 왜 있는지 모른다. __FILE __, __ LINE__은 나를 이해하기가 어렵다. – hegendroffer

+0

' ERR'은 매크로의 이름이고 (이것은 코드가 정의한 것입니다),'perror','fprintf' 그리고 다른 모든 것은 C 표준 라이브러리의 일부입니다. 온라인상에서 정의를 찾을 수 있습니다. 그리고 백 슬래시는 매크로 정의는 다음 라인에서 계속됩니다 (모든 것을 하나의 라인에 넣을 필요는 없습니다). – UnholySheep

답변

3

매크로에서 백 슬래시는 마치 다음 줄을 읽을 수 있다는 것을 의미합니다 그것은 한 줄, 그래서이 아래로 비등 예를

를 들어, #define 전처리 문은 다른 코드와 코드를 대체하는 데 사용됩니다

#define ERR(source) (perror(source), fprintf(stderr,"s:%d\n",__FILE__,__LINE__), exit(EXIT_FAILURE)) 

코드를 컴파일하기 전에 코드에서 SOMECONSTANT5으로 바꿉니다. 전처리 기는 또한 함수 형식의 구문을 이해합니다.이 구문은 사용자가 여기있는 것입니다. 다음 본체에

매크로 결과 : 귀하의 경우

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

관련 문제