2013-06-02 3 views
0

일부 C 코드를 읽고 있는데 여기에 붙어 있습니다.조건부 파생물 - #define in C

아래에서 헤더 파일에서 코드 스 니펫을 찾을 수 있습니다.

#if NUMREPS == 0 
     #define REPEAT(line) REPEAT0(line); 
#elif NUMREPS == 16 
     #define REPEAT(line) REPEAT16(line); 
#endif 

그리고 식별자 repeat16(line);의 파생

이 정의된다 :

#define REPEAT16(line) \ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line;\ 
    line; 

정확히 코드 조각은 무엇입니까? 이 코드를 이해하기 위해 link의 도움을 받았다.

+0

: 전체 함수를 정의하는 매크로를 사용하는 경우

종종 사용된다? –

+0

정확히'line; \'은 무엇을합니까? – pistal

+0

'gcc -C -E sourcecode.c> sourcecode.i'를 사용하여 전처리 된 형태의'sourcecode.i'를 얻습니다. 그런 다음 호출기 ('less sourcecode.i') 또는 편집기 ('emacs sourcecode.i')를 사용하여 내부를 살펴보십시오. –

답변

6

전처리 기는 실제 컴파일 전에 실행되는 컴파일 프로세스의 단계입니다. 매크로가하는 일은 매크로 호출을 매크로 본문으로 대체하는 것입니다. 그래서 전처리 기가 REPEAT16의 "호출"을 보았을 때, 단순히 시체와 같이 16 번 반복 된 매크로에 대한 인수로 그것을 대체합니다.

인수 line가 매크로에 전달, 그래서 당신은 예를 들어

REPEAT16(printf("hello\n")) 

처럼 호출하면 다음 컴파일러가 보는 코드가

printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); 

\ 성격이 될 것입니다 정확히 매크로 본문은 전처리기에 현재 행이 다음 행에 계속됨을 알립니다. 그래서 전신은 한줄이 될 것입니다.

+0

그냥 간단한 질문입니다. 즉, '개행 문자가 없다'고 가정합니다. – pistal

+3

'if (false) REPEAT16 (printf ("hello \ n")); ''hello'를 15 번 인쇄합니다. –

+0

@ user2015933 아니요, 전 처리기는 개행을 추가하지 않습니다. 매크로 본문은 단일 행이어야하며'\'를 사용하면 여러 줄 매크로 본문을 단일 행으로 병합 할 수 있습니다. –

4

줄 끝의 백 슬래시 (\)는 다음 줄이있는 전 처리기로 바뀝니다.

대체 텍스트가 단일 "논리적"줄에 있어야하기 때문에 줄 바꿈 매크로를 작성하는 것이 일반적입니다. 줄 연속을 사용하면 읽기 쉽습니다. 당신을 당혹 부분

#define INT_RETURNER(x) int return_ ## x (void)\ 
         {\ 
          return x;\ 
         } 

INT_RETURNER(4711) 

int main(void) 
{ 
    printf("%d!\n", return_4711()); 
} 
+0

왜 대체 텍스트가 단일 논리 라인에 있어야합니까? – pistal

+0

@ user2015933 매크로는 둘 이상의 논리 행을 확장 할 수 없기 때문에. 나는 표준이 좀 더 정확한 언어를 가지고 있다고 확신하지만 이것이 기본이다. –