소프트웨어가 업데이트될 때, 당장 사용하지 않지만 언제 재사용될지 몰라서 남겨둬야 하는 코드들이 있거나, 하나의 소스코드를 국가마다 언어를 다르게 하고싶다거나 할때 이런 경우 #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 }