[C, C++] #ifdef, #if defined() 활용

소프트웨어가 업데이트될 때, 당장 사용하지 않지만 언제 재사용될지 몰라서 남겨둬야 하는 코드들이 있거나, 하나의 소스코드를 국가마다 언어를 다르게 하고싶다거나 할때 이런 경우 #if, #if defined와 같은 전처리기가 유용하게 활용된다.

클린코드인가 어디선가 사용하지 않는 코드나 주석은 남기지 말고 지우라지만 안쓰기가 쉽지않다. 그런데 확실히 ifdef가 많으면 코드가 지저분해지는건 어쩔수가 없다.

#ifdef

#ifdef는 #define으로 정의된 매크로와 함께 쓰이는데, 해당 매크로(#define)가 이미 정의되어 있을 때만 #ifdef ~ #endif 영역이 컴파일된다.

#include <stdio.h>

#define VER_1
//#define VER_2

int main(){

#ifdef VER_1
    printf("ver1");
#endif

#ifdef VER_2
    printf("ver2");
#endif

}

위 코드를 실행하면 “ver1″이 출력된다. VER_1이 정의되어 있으므로 #ifdef VER_1 ~ #endif 내부의 printf가 실행된 결과다. 그리고 VER_2는 주석처리되어 정의되어 있지 않기 때문에 #ifdef VER_2 ~ #endif 영역은 컴파일 단계에서 생략되었다. 따라서 위와 같이 코드의 내용을 매크로로 쉽게 ON/OFF 할 수 있다.

위 코드는 아래와 같이 표현할 수도 있다. 하나의 매크로만 사용하기 위해 #else를 사용하였다.

#include <stdio.h>

#define VER_2 // if commented out, compiled ver1

int main(){

#ifdef VER_2
    printf("ver2");
#else
    printf("ver1");
#endif

}

#if defined( )

#ifdef 대신 #if defined으로 대체할 수도 있다.

#include <stdio.h>

#define VER_1
//#define VER_2

int main(){

#if defined(VER_1)
    printf("ver1");
#else
    printf("ver2");
#endif
}

if defined은 ifdef와 다르게 여러 항목을 비교할 수 있다.

#include <stdio.h>

#define VER_1
//#define VER_2

int main(){

#if defined(VER_1) || defined(VER_2)
    printf("ver1 or ver2");
#endif
}

Leave a Comment