매크로는 함수, 상수 선언 이외에도 특정 조건에 따라서 컴파일 할 코드를 선택할때 사용할 수 있다.
#if .. #endif 명령문은 #if 가 참이라면 해당 범위의 코드가 삽입되고, 거짓이라면 해당 부분의 코드는 컴파일 시에 무시된다.
#define TRUE 1
#define FALSE 0
int main(){
#if TRUE // TRUE가 참이라면 해당 범위의 코드를 삽입
std::cout << "True!" << std::endl;
#elif FALSE
std::cout << "False!" << std::endl;
#endif
}
위와 같이 특정 조건이 참일때만 해당 코드를 삽입해야 할때 사용 할 수 있다. 또한 #endif 명령문을 통해 조건문을 종료해야 한다.
조건부 컴파일의 대표적인 사용 예시는, 컴파일 환경에 따라 코드를 다르게 작성할때 사용할 수 있다. 윈도우 환경에선 특정 코드를 사용하고, 리눅스 환경에선 다른 코드를 사용할때 조건부 컴파일을 통하여 컴파일 되는 코드를 나눌 수있다.
int main() {
// Windows 운영체제에서 컴파일될 때
#ifdef _WIN32
std::cout << "This code is compiled for Windows.\n";
// Windows 특정 API 함수 호출
// MessageBoxA(NULL, "Hello Windows!", "Info", MB_OK);
#elif __linux__
// Linux 운영체제에서 컴파일될 때
std::cout << "This code is compiled for Linux.\n";
// Linux 특정 시스템 호출
// sleep(1);
#else
// 다른 운영체제에서 컴파일될 때
std::cout << "This code is compiled for an unknown OS.\n";
#endif
return 0;
}
또 다른 사용 예시는 디버그 모드와 릴리즈 모드에서 삽입될 코드를 조건부 컴파일을 통해 나눌 수 있다.
#include <iostream>
// 보통 빌드 시스템(CMake, Makefile 등)에서 -DDEBUG_MODE 와 같이 정의함
// #define DEBUG_MODE // 직접 정의해도 됨
void perform_operation() {
std::cout << "Performing core operation...\n";
// DEBUG_MODE가 정의되어 있을 때만 이 코드가 컴파일됨
#ifdef DEBUG_MODE
std::cout << "DEBUG: Checking intermediate values...\n";
int temp_val = 10;
std::cout << "DEBUG: temp_val = " << temp_val << "\n";
#endif
std::cout << "Operation completed.\n";
}
int main() {
perform_operation();
return 0;
}