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

프로그래밍/C 2019.05.29 댓글 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문도 컴파일되었습니다

댓글