수색…


통사론

  • #define [symbol] // 컴파일러 심볼을 정의합니다.
  • #undef [symbol] // 컴파일러 심볼을 정의 해제합니다.
  • #warning [경고 메시지] // 컴파일러 경고를 생성합니다. #if와 함께 유용합니다.
  • #error [오류 메시지] // 컴파일러 오류를 생성합니다. #if와 함께 유용합니다.
  • #line [행 번호] (파일 이름) // 컴파일러 행 번호를 대체합니다 (선택적으로 소스 파일 이름). T4 텍스트 템플릿 과 함께 사용됩니다.
  • #pragma warning [disable | restore] [경고 번호] // 컴파일러 경고를 비활성화 / 복원합니다.
  • #pragma checksum " [filename] " " [guid] " " [checksum] "// 소스 파일의 내용을 검증합니다.
  • #region [region name] // 접을 수있는 코드 영역을 정의합니다.
  • #endregion // 코드 영역 블록을 끝냅니다.
  • #if [condition] // 조건이 참이면 아래 코드를 실행합니다.
  • #else / #if 뒤에 사용됩니다.
  • #elif [condition] // #if 뒤에 사용됩니다.
  • #endif // #if로 시작하는 조건부 블록을 종료합니다.

비고

전 처리기 지시문은 일반적으로 다양한 실행 환경에서 소스 프로그램을 쉽게 변경하고 컴파일하기 쉽도록하기 위해 사용됩니다. 소스 파일의 지시문은 전 처리기에 특정 작업을 수행하도록 지시합니다. 예를 들어 전처리 기는 텍스트의 토큰을 대체하거나, 다른 파일의 내용을 소스 파일에 삽입하거나, 텍스트 섹션을 제거하여 파일의 일부분을 컴파일하지 않을 수 있습니다. 전 처리기 라인은 매크로 확장 전에 인식되고 실행됩니다. 따라서 매크로가 전 처리기 명령처럼 보이는 것으로 확장되면 해당 명령은 전처리 기가 인식하지 못합니다.

프리 프로세서 명령문은 이스케이프 시퀀스가 ​​지원되지 않는다는 점을 제외하고 소스 파일 명령문과 동일한 문자 집합을 사용합니다. 전 처리기 명령문에 사용 된 문자 세트는 실행 문자 세트와 동일합니다. 전 처리기는 또한 음의 문자 값을 인식합니다.

조건식

조건식 ( #if , #elif 등)은 부울 연산자의 제한된 하위 집합을 지원합니다. 그들은:

  • ==!= . 심볼이 true (정의) 또는 false (정의되지 않음)인지 여부를 테스트하는 데에만 사용할 수 있습니다.
  • && , || , !
  • ()

예 :

#if !DEBUG && (SOME_SYMBOL || SOME_OTHER_SYMBOL) && RELEASE == true
Console.WriteLine("OK!");
#endif

"OK"를 인쇄하는 코드를 컴파일합니다. DEBUG 가 정의되지 않은 경우 콘솔에 SOME_SYMBOL 또는 SOME_OTHER_SYMBOL 이 정의되고 RELEASE 가 정의됩니다.

참고 : 이러한 대체는 컴파일 타임에 수행되므로 런타임에 검사 할 수 없습니다. #if 를 사용하여 제거 된 코드는 컴파일러의 출력에 포함되지 않습니다.

참고 항목 : MSDN의 C # 전 처리기 지시문

조건식

다음을 컴파일하면 정의 된 지시문에 따라 다른 값을 반환합니다.

// Compile with /d:A or /d:B to see the difference
string SomeFunction() 
{
#if A
    return "A";
#elif B
    return "B";
#else
    return "C";
#endif
}

조건식은 일반적으로 디버그 빌드에 대한 추가 정보를 기록하는 데 사용됩니다.

void SomeFunc()
{
    try
    {
        SomeRiskyMethod();
    }
    catch (ArgumentException ex)
    {
        #if DEBUG
        log.Error("SomeFunc", ex);
        #endif

        HandleException(ex);
    }
}

컴파일러 경고 및 오류 생성

#warning 지시문을 사용하여 컴파일러 경고를 생성 할 수 있으며 #error 지시문을 사용하여 #error 생성 할 수 있습니다.

#if SOME_SYMBOL
#error This is a compiler Error.
#elif SOME_OTHER_SYMBOL
#warning This is a compiler Warning.
#endif

심볼 정의 및 정의 해제

컴파일러 기호는 컴파일 타임에 정의 된 키워드로 조건부로 특정 코드 섹션을 검사 할 수 있습니다.

컴파일러 심볼을 정의하는 세 가지 방법이 있습니다. 코드를 통해 정의 할 수 있습니다.

#define MYSYMBOL

Visual Studio의 프로젝트 속성> 빌드> 조건부 컴파일 기호에서 정의 할 수 있습니다.

VS 컴파일러 기호

( DEBUGTRACE 는 자체 체크 박스를 가지고 있으므로 명시 적으로 지정할 필요는 없습니다.)

또는 C # 컴파일러 인 csc.exe 에서 /define:[name] 스위치를 사용하여 컴파일 타임에 정의 할 수 있습니다.

#undefine 지시문을 사용하여 기호를 정의하지 않을 수도 있습니다.

이것의 가장 보편적 인 예는 응용 프로그램이 디버그 모드에서 컴파일 될 때 Visual Studio에 의해 정의 된 DEBUG 기호입니다 (릴리스 모드와 비교).

public void DoBusinessLogic()
{
    try
    {
        AuthenticateUser();
        LoadAccount();
        ProcessAccount();
        FinalizeTransaction();
    }
    catch (Exception ex)
    {
#if DEBUG
        System.Diagnostics.Trace.WriteLine("Unhandled exception!");
        System.Diagnostics.Trace.WriteLine(ex);
        throw;
#else
        LoggingFramework.LogError(ex);
        DisplayFriendlyErrorMessage();
#endif
    }
}

응용 프로그램 (및 디버그 모드에서 컴파일하는 경우 오류가 애플리케이션의 비즈니스 로직 발생하면 위의 예에서, DEBUG 심볼이 설정된다), 에러가 추적 로그에 기록되고, 예외는 재사용 될 디버깅을 위해 throw됩니다. 그러나 응용 프로그램이 릴리스 모드로 컴파일되고 ( DEBUG 기호가 설정되지 않은 경우) 로깅 프레임 워크가 자동으로 오류를 기록하는 데 사용되며 친숙한 오류 메시지가 일반 사용자에게 표시됩니다.

지역 블록

#region#endregion 을 사용하여 접을 수있는 코드 영역을 정의하십시오.

#region Event Handlers

public void Button_Click(object s, EventArgs e)
{
    // ...
}

public void DropDown_SelectedIndexChanged(object s, EventArgs e)
{
    // ...
}

#endregion

이러한 지시문은 축소 가능 영역을 지원하는 IDE (예 : Visual Studio )를 사용하여 코드를 편집 할 때만 유용합니다.

기타 컴파일러 명령어

#line 은 경고 및 오류를 출력 할 때 컴파일러가보고 한 행 번호 및 파일 이름을 제어합니다.

void Test()
{
    #line 42 "Answer"
    #line filename "SomeFile.cs"
    int life; // compiler warning CS0168 in "SomeFile.cs" at Line 42
    #line default
    // compiler warnings reset to default
}

Pragma Checksum

#pragma checksum 사용하면 디버깅을 위해 생성 된 프로그램 데이터베이스 (PDB)에 대한 특정 체크섬을 지정할 수 있습니다.

#pragma checksum "MyCode.cs" "{00000000-0000-0000-0000-000000000000}" "{0123456789A}"

조건부 속성 사용

System.Diagnostics 네임 스페이스의 Conditional 특성을 메서드에 추가하는 것은 빌드에서 호출되는 메서드와 그렇지 않은 메서드를 제어하는 ​​명확한 방법입니다.

#define EXAMPLE_A

using System.Diagnostics;
class Program
{
    static void Main()
    {
        ExampleA(); // This method will be called
        ExampleB(); // This method will not be called
    }

    [Conditional("EXAMPLE_A")]
    static void ExampleA() {...}

    [Conditional("EXAMPLE_B")]
    static void ExampleB() {...}
}

컴파일러 경고 비활성화 및 복원

#pragma warning disable 사용하여 컴파일러 경고를 #pragma warning disable 하고 #pragma warning restore 사용하여 복원 할 수 있습니다.

#pragma warning disable CS0168

// Will not generate the "unused variable" compiler warning since it was disabled
var x = 5;

#pragma warning restore CS0168

// Will generate a compiler warning since the warning was just restored
var y = 8;

쉼표로 구분 된 경고 번호가 허용됩니다.

#pragma warning disable CS0168, CS0219

CS 접두사는 선택 사항이며 심지어 섞여서 사용할 수도 있습니다 (모범 사례는 아니지만).

#pragma warning disable 0168, 0219, CS0414

프로젝트 레벨에서의 커스텀 프리 프로세서

테스트를 위해 일부 작업을 건너 뛸 필요가있을 때 프로젝트 수준에서 사용자 지정 조건부 사전 처리를 설정하는 것이 편리합니다.

Solution Explorer 이동 -> 변수를 설정하려는 프로젝트에서 마우스 오른쪽 버튼을 클릭 -> Properties -> Build -> 일반에서 필드 찾기 Conditional compilation symbols 를 입력하고 여기에 조건부 변수를 입력하십시오.

여기에 이미지 설명을 입력하십시오.

코드를 건너 뛰는 코드 예제 :

public void Init()
{
    #if !IGNOREREFRESHDB
    // will skip code here
     db.Initialize();
    #endif
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow