C#에는 코드의 특정 위치에서 의도적으로 오류나 경고를 발생시킬 수 있는 전처리기 지시문이 있습니다. 바로 #error와 #warning입니다. 이 두 지시문은 주로 조건부 컴파일(#if, #endif)과 함께 사용되어, 개발 중에 필수 조건이 충족되지 않았을 때 컴파일러를 통해 명확한 메시지를 전달하는 데 유용합니다.
#error 지시문이란?
#error 지시문은 코드의 특정 위치에서 컴파일 오류를 강제로 발생시킵니다. 이 지시문이 실행되면 컴파일이 실패하며, 지정한 사용자 정의 오류 메시지가 출력됩니다. 예를 들어, 프로젝트에 반드시 정의되어야 하는 기호(심볼)가 누락된 경우 빌드 자체를 막아버리는 안전장치로 활용할 수 있습니다.
예제
using System;
namespace Demo {
class Program {
public static void Main(string[] args) {
#if (!ONE)
#error ONE is undefined
#endif
Console.WriteLine("Generating a user-defined error!");
}
}
}위 프로그램을 실행하면 기호 ONE이 정의되어 있지 않으므로 다음과 같이 사용자 정의 오류가 발생하고 컴파일에 실패합니다.
출력 결과
Compilation failed: 1 error(s), 0 warnings error CS1029: #error: 'ONE is undefined'
#warning 지시문이란?
#warning 지시문은 코드의 특정 위치에서 수준 1(Level 1) 경고를 생성합니다. #error와 달리 컴파일은 계속 진행되며 프로그램도 정상적으로 실행됩니다. 치명적이지는 않지만 개발자가 인지해야 할 사항이 있을 때 주의를 환기시키는 용도로 적합합니다.
예제
using System;
namespace Demo {
class Program {
public static void Main(string[] args) {
#if (!TWO)
#warning TWO is undefined
#endif
Console.WriteLine("Generates a warning!");
}
}
}위 프로그램을 실행하면 경고가 생성되지만, 오류가 아니므로 콘솔 출력은 정상적으로 표시됩니다.
출력 결과
warning CS1030: #warning: `TWO is undefined' Generates a warning!
#error와 #warning의 차이점 정리
두 지시문의 핵심적인 차이는 다음과 같습니다.
- #error: 컴파일을 중단시키는 오류(CS1029)를 발생시킵니다. 빌드가 실패하며 프로그램이 실행되지 않습니다.
- #warning: 컴파일은 계속 진행되는 경고(CS1030)를 발생시킵니다. 프로그램은 정상적으로 빌드되고 실행됩니다.
두 지시문 모두 조건부 컴파일 지시문인 #if, #endif와 결합하여 사용하면, 특정 플랫폼이나 구성(Configuration)에서 누락된 설정을 컴파일 시점에 즉시 확인할 수 있어 코드 품질 관리에 큰 도움이 됩니다.