1. #if
흔히 디버그 빌드용으로 컴파일하거나 특정 구성용으로 컴파일 할때 주로 사용됩니다.
#if로 시작한 조건부 지시문은 명시적으로 #endif 지시문으로 종료해야합니다.
Example )
#define DEBUG
#define VC_V7
using System;
public class MyClass
{
public static void Main()
{
#if (DEBUG && !VC_V7)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
Console.WriteLine("DEBUG and VC_V7 are defined");
#else
Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
}
}
OutPut : DEBUG and VC_V7 are defined
2. #else
#if의 선택적 요소일때 #else를 사용합니다.
3. #elif
프로그램용어로 받아들이기 쉽게 하자면 else if 문입니다. 복합 조건부 지시문을 만들때 사용합니다.
4. #endif
#if 지시문으로 시작한 조건부 지시문의 끝을 지정합니다.
5. #define
사용자 기호를 정의합니다. 이때 정의한 기호를 #if 지시문에 전달되는 식으로 사용하면 식이 true로 계산됩니다.
ㅇ. 기호를 사용하여 컴파일 조건을 지정할 수 있습니다. 이는 #if , #elif로 테스트 할수 있습니다.
또한 conditional 특성을 사용하여 조건부 컴파일을 수행 할 수도 있습니다.
ㅇ. 기호를 정의할 수 있지만 해당 기호에 값을 대입할 수는 없습니다. 지시문이 아닌 모든 명령어를 사용하려면 #define지시문이 먼저 파일에 나타나야합니다.
ㅇ. /define 컴파일러 옵션으로 기호를 정의할 수도 있습니다. 또한 #undef로 기호를 정의하지 않을수도 있습니다. /define , #define으로 정의하는 기호는 같은 이름의 변수와 충돌하지 않습니다. 즉,변수 이름을 전처리기 지시문에 전달해서는 안되며 기호는 전처리기 지시문으로만 계살 할수 있습니다.
#define으로 만든 기호의 범위는 해당 기호가 정의된 파일입니다.
6. #undef
기호를 정의하지 않습키다. 이때 정의하지 않은 기호를 #if지시문의 식으로 사용하면 식이 false로 계싼됩니다.
Example)
// preprocessor_undef.cs
// compile with: /d:DEBUG
#undef DEBUG
using System;
public class MyClass
{
public static void Main()
{
#if DEBUG
Console.WriteLine("DEBUG is defined");
#else
Console.WriteLine("DEBUG is not defined");
#endif
}
}
Output :
DEBUG is not defined
7. #warning
코드의 특정위치에서 수준 1의 경고를 생성할 수 있습니다.
Example)
// preprocessor_warning.cs
// CS1030 expected
#define DEBUG
public class MyClass
{
public static void Main()
{
#if DEBUG
#warning DEBUG is defined
#endif
}
}
8. #error
코드의 특정 위치에서 오류를 생성할 수 있습니다.
Example)
// preprocessor_error.cs
// CS1029 expected
#define DEBUG
public class MyClass
{
public static void Main()
{
#if DEBUG
#error DEBUG is defined
#endif
}
}
9. #line
오류 및 경고에 대해 컴파일러가 출력하는 줄 번호와 파일 이름을 수정할 수 있습니다.
#line 지시문은 빌드 프로세스의 자동화된 중간 단계에서 사용합니다. 예를 들어, 원본 소스 코드 파일의 줄을 제거했지만 컴파일러에서 파일의 원래 줄 번호를 따라 출력하려는 경우, 줄을 제거한 다음 #line을 사용하여 원래 줄 번호를 시뮬레이션할 수 있습니다.
#line hidden 지시문은 이 지시문 다음에 나오는 줄을 디버거에서 숨깁니다. 따라서 개발자가 코드를 단계별로 실행할 경우 #line hidden과 다음 #line 지시문(이 지시문이 다른 #line hidden 지시문이 아니라고 가정하고) 사이에 있는 모든 줄을 건너 뜁니다. 뿐만 아니라 이 옵션을 사용해 ASP.NET에서 사용자 정의 코드와 시스템 생성 코드를 구별하도록 할 수 있습니다. 현재는 ASP.NET에서 이 기능을 주로 사용하지만 앞으로는 보다 많은 소스 생성기에서 이 기능을 사용하게 될 것입니다.
#line hidden 지시문은 오류 보고에 나타나는 파일 이름이나 줄 번호에는 영향을 주지 않습니다. 따라서 숨겨진 블록에서 오류가 발생하더라도 컴파일러가 현재 파일 이름과 오류를 발생시킨 줄 번호를 보고합니다.
소스 코드 파일에 여러 개의 #line 지시문을 사용할 수 있습니다.
Example 1.)
// preprocessor_line.cs
public class MyClass2
{
public static void Main()
{
#line 200
int i; // CS0168 on line 200
#line default
char c; // CS0168 on line 9
}
}
Example1 은 줄 번호와 관련된 두개의 경고를 보고하는 방법을 보여줍니다.
#line 200 지시문은 기본값이 #7인 줄 번호를 강제로 200으로 만듭니다. 다른 줄 #9 는 기본 #line지시문의 결과에 따라 일반적인 시퀀스를 따릅니다.
Example 2.)
// preprocessor_linehidden.cs
using System;
class MyClass
{
public static void Main()
{
Console.WriteLine("Normal line #1."); // Set a break point here.
#line hidden
Console.WriteLine("Hidden line.");
#line default
Console.WriteLine("Normal line #2.");
}
}
Example 2. 는 디버거가 코드의 숨겨진 줄을 무시하는 방법을 보여줍니다. 실행하면 이상없이 텍스트 세 줄이 표시 됩니다. 그러나 중단점을 걸어놓고 F10 키로 단계적 실행을 수행하면 디버거가 숨겨진 줄을 무시합니다. 뿐만 아니라 숨겨진 줄에 중단점을 설정하더라도 디버거가 해당 줄을 무시합니다.
10. #region / #endregion
제일 많이 사용들 하시는 개요 표시 및 숨기기 기능입니다.
Example)
// preprocessor_region.cs
#region MyClass definition
public class MyClass
{
public static void Main()
{
}
}
#endregion