플로렌스라는 개발자

조건부 컴파일(Conditional Compilation)을 위한 매크로

프로그래밍/C 2019.05.29 댓글 0 Plorence

목차

    조건부 컴파일 매크로

    조건부 컴파일 매크로는 특정 조건에 따라 소스코드의 일부를 삽입하거나 삭제할 수 있도록 디자인된 지시자입니다

    다섯 가지가 있습니다.

    • #if... #endif : 참이라면

    • #ifdef... #endif : 정의되었다면

    • #ifndef... #endif : 정의되지 않았다면

    • #else의 삽입 (#if,#ifdef,#ifndef에 해당) : #if(또는#ifdef,#ifndef)에서 아니라면

    • #elif의 삽입 (#if에만 해당) : else if와 같은것.(앞 조건문이 참이 아니라면)

    4,5번은 1,2,3번의 중간에 들어간다는 공통점이 있고 1,2,3번은 끝이 #endif라는 점입니다.

     

    #if... #endif 

    #include <stdio.h>
    #define one 1
    #define zero 0
    int main(void) {
    #if one //one이 참이라면
        printf("%d", one);
    #endif
    #if zero //zero가 참이라면
        printf("%d", zero);
    #endif
        return 0;
    }

    #if 다음에 조건이 옵니다. 선행 처리기로 인해 치환되면 1입니다. if문에서 1은 참을 의미합니다.

    반대로 아래 #if zero는 치환되면 #if 0으로 바뀌기 때문에 거짓이 됩니다.

    #include <stdio.h>
    int main(void) {
        printf("%d",1);
        return 0;
    }

    선행 처리기 이후의 코드입니다. 앞에 #define에서 설명했듯이 치환되면서 명령문이었던 매크로는 사라집니다.

    위에 #if one은 참이기 때문에 1을 출력하는 printf함수만 남습니다.

     

    #elif

    #include <stdio.h>
    #define one 1
    int main(void) {
    #if one //one이 참이라면
           printf("%d", one);
    #elif two
           printf("%d", two);
    #endif
           return 0;
    }

    이 코드에선 two가 참 이어도 one이 참이어서 첫 번째 printf문만 남습니다.

     

    ifdef... #endif

    #include <stdio.h>
    #define SQUARE(X) ( (X)*(X) )
    #define ADD(A) ( (A) + (A) )
    int main(void) {
    
    #ifdef SQUARE
        printf("%d", SQUARE(2));
    #endif
    #ifdef ADD
        printf("%d", ADD(10));
    #endif
        return 0;
    }

    #ifdef...#endif 즉 정의되어있다면 이라는 조건부 컴파일 매크로를 사용했습니다.

    일단 SQUARE(X)와 ADD(X)라는 매크로 함수가 정의가 되어있습니다.

    선행 처리기를 통해 #ifdef에서 SQUARE,ADD둘다 정의되어있으니 둘다 참입니다.

    #include <stdio.h>
    int main(void) {
        printf("%d", ((2)*(2)));
        printf("%d", ((10)+(10)));
        return 0;
    }

    선행처리기 이후의 코드입니다. ifdef 모두 참이기 때문에 #define도 치환되고 printf문도 컴파일되었습니다

    댓글

    0