C언어 선행처리기 조건부 컴파일

    2018-02-05 16:40:26 작성

    특정 조건에 따라 소스코드의 일부를 포함하거나 포함하지 않고 컴파일하도록 합니다.

    #if ... #endif

    #if 조건이 참이면 컴파일에 포함합니다.
    다음과 같은 형식을 갖습니다.

    #if 조건1
        조건1이 참이면 컴파일에 포함
    #elif 조건2
        조건2가 참이면 컴파일에 포함
    #else
        조건이 모두 거짓이면 컴파일에 포함
    #endif

    구성은 if문과 유사합니다.
    #else와 #elif는 상황에 따라 쓰이지 않을 수 있지만 #endif는 필수로 있어야 합니다.

    #include <stdio.h>
    
    #define A 1
    #define B 2
    #define C 3
    #define CNUM 2
    
    int main(void) {
    #if CNUM == A
        printf("매크로 상수 CNUM == %d\n", A);
    #elif CNUM == B
        printf("매크로 상수 CNUM == %d\n", B);
    #elif CNUM == C
        printf("매크로 상수 CNUM == %d\n", C);
    #else
        printf("매크로 상수 CNUM은 %d, %d, %d가 아닙니다.\n", A, B, C);
    #endif
        return 0;
    }


    조건부 컴파일은 컴파일 단계에서 포함/제외 합니다.


    #ifdef ... #endif

    #if는 매크로 정의의 값을 비교하여 컴파일을 했다면
    #ifdef는 매크로 정의가 되어있다면 컴파일 합니다.

    #include <stdio.h>
    
    #define A 0
    
    int main(void) {
    #if A
        printf("매크로 상수 A는 참입니다.\n");
    #endif
    
    #ifdef A
        printf("매크로 상수 A는 정의 되어 있습니다.\n");
    #endif
        return 0;
    }


    #if A 는 0은 거짓이기 때문에 컴파일에 포함하지 않습니다.
    #ifdef A는 매크로 A가 정의 되어있기 때문에 컴파일에 포함됩니다.


    #ifndef ... #endif

    #ifndef는 매크로 정의가 되어있지 않다면 컴파일 합니다. #ifdef의 반대 입니다.

    #ifndef _MYMACRO_
    #define _MYMACRO_
        ...
    #endif

    위의 코드는 헤더파일디자인에서 다루겠지만, 한번만 컴파일 해야 할 경우에 쓰이는 패턴입니다.