C#의 #undef 지시문은 이전에 정의된 심볼(기호 상수)의 정의를 해제하는 전처리기 지시문입니다. 정의가 해제된 심볼은 #if 지시문과 함께 평가될 때 false로 처리되므로, 조건부 컴파일 시 해당 코드 블록이 컴파일되지 않습니다.
#undef 지시문 기본 문법
#undef SYMBOL
예를 들어 아래와 같이 작성하면 One이라는 심볼의 정의가 해제됩니다.
#undef One
#undef 지시문 예제
다음 예제에서는 One 심볼을 정의하고 Two 심볼의 정의를 해제한 뒤, #if / #elif / #else 지시문을 사용해 각 심볼의 정의 여부에 따라 서로 다른 메시지를 출력합니다.
#define One
#undef Two
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
#if (One && Two)
Console.WriteLine("Both are defined");
#elif (One && !Two)
Console.WriteLine("One is defined and Two is undefined");
#elif (!One && Two)
Console.WriteLine("One is undefined and Two is defined");
#else
Console.WriteLine("Both are undefined");
#endif
}
}
}
실행 결과
One is defined and Two is undefined
코드 설명
#define One으로 One 심볼을 정의했고, #undef Two로 Two 심볼의 정의를 해제했습니다. 따라서 첫 번째 조건 (One && Two)는 거짓이 되고, 두 번째 조건 (One && !Two)가 참이 되어 "One is defined and Two is undefined"가 출력됩니다. 이처럼 #undef는 특정 기능이나 디버그 코드를 조건부로 활성화하거나 비활성화할 때 유용하게 사용됩니다.
#undef 사용 시 주의 사항
- 대소문자 구분: C# 전처리기 심볼은 대소문자를 엄격하게 구분합니다.
Two와TWO는 서로 다른 심볼로 취급되므로,#if조건식에서 반드시 동일한 철자를 사용해야 합니다. - 선언 위치 제한:
#define과 마찬가지로#undef는 네임스페이스나 클래스 등 실제 코드가 시작되기 전에 작성해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다. - 컴파일러 옵션으로 정의된 심볼: 컴파일러 옵션(
/define)으로 정의된 심볼은 소스 코드 내에서#undef로 해제할 수 없습니다. - 정의되지 않은 심볼: 한 번도 정의된 적 없는 심볼에
#undef를 사용해도 컴파일 오류는 발생하지 않습니다.