C# 조건부 전처리기 지시문이란?
C#에서는 #if 지시문을 사용해 조건부 전처리기(conditional directive)를 작성할 수 있습니다. 조건부 전처리기는 특정 심볼(symbol)이 참(true)으로 평가되는지 검사할 때 유용하게 쓰입니다. 평가 결과가 참이라면, 컴파일러는 #if 지시문부터 다음 지시문 사이에 있는 모든 코드를 컴파일 대상으로 삼습니다.
조건부 컴파일은 디버그 빌드와 릴리스 빌드처럼 환경에 따라 다른 코드를 실행해야 할 때 특히 유용합니다. 이러한 지시문은 실제 컴파일이 시작되기 전 단계에서 처리된다는 점이 일반적인 if 문과의 큰 차이입니다.
기본 문법
#if symbol [operator symbol]...
여기서 symbol은 검사하고자 하는 심볼의 이름입니다. true 또는 false 값을 직접 사용할 수도 있고, 부정 연산자(!)를 심볼 앞에 붙여 논리를 반전시키는 것도 가능합니다.
operator symbol은 심볼을 평가하는 데 사용하는 연산자로, 다음 네 가지를 사용할 수 있습니다.
- == (같음)
- != (같지 않음)
- && (논리곱, AND)
- || (논리합, OR)
아래 예제는 C#에서 조건부 전처리기 지시문을 실제로 활용하는 방법을 보여줍니다.
예제 코드
#define DEBUG
#define VC_V10
using System;
public class Demo {
public static void Main() {
#if (DEBUG && !VC_V10)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V10)
Console.WriteLine("VC_V10 is defined");
#elif (DEBUG && VC_V10)
Console.WriteLine("DEBUG and VC_V10 are defined");
#else
Console.WriteLine("DEBUG and VC_V10 are not defined");
#endif
Console.ReadKey();
}
}위 코드에서는 #define 지시문을 통해 DEBUG와 VC_V10 두 심볼을 정의했습니다. 따라서 세 번째 분기인 #elif (DEBUG && VC_V10) 조건이 참이 되어 해당 블록 안의 코드가 실행됩니다.
참고로 #if로 시작한 조건부 블록은 반드시 #endif로 닫아야 하며, 중간에 #elif(else if 역할)와 #else를 추가해 여러 조건을 분기 처리할 수 있습니다.
실행 결과
DEBUG and VC_V10 are defined