본문 바로가기
프로그래밍 언어/C#

C# 전처리기 지시문

by Jinger 2023. 7. 5.

서론

    C#(에서 지시문(Directive)은 프로그램의 컴파일 동작을 제어하는 데 사용되는 특별한 명령문이다. 지시문은 주로 컴파일러에게 컴파일 동작을 설정하거나 조건부 컴파일을 수행하도록 지시한다.


using 지시문

    using 지시문은 네임스페이스를 사용할 때 자주 사용된다. 다른 네임스페이스의 클래스를 현재 파일에서 사용하려면 using 지시문을 사용하여 해당 네임스페이스를 가져온다.

using System;

#ExternalSource 지시문

    #ExternalSource 지시문은 C# 코드와 외부 소스 파일 간의 연결을 설정하는 데 사용된다. 이를 통해 디버깅 시나리오에서 실제 소스 파일과 디버거 간의 정확한 대응 관계를 설정할 수 있다.
    #ExternalSource 지시문은 주로 코드 생성 도구나 중간 언어 (IL) 생성 도구에서 사용된다. 예를 들어, 코드 생성 도구는 동적으로 C# 소스 코드를 생성할 때 #ExternalSource 지시문을 사용하여 생성된 코드와 원본 소스 코드의 대응 관계를 유지할 수 있다. #ExternalSource 지시문은 다음과 같은 형식을 갖는다

#ExternalSource("파일_이름", 줄_번호)
  • "파일_이름"은 외부 소스 파일의 이름을 나타낸다. 이 파일은 현재 소스 파일과 대응된다.
  • 줄_번호는 현재 소스 파일에서의 대응하는 줄 번호이다.

    #ExternalSource 지시문은 대응하는 외부 소스 파일과 줄 번호를 지정하여 해당 코드 블록이 원본 소스 코드와 연결되도록 한다. 이를 통해 디버거는 실제 소스 코드에서 디버깅할 수 있으며, 디버깅 경험이 원활해진다. #ExternalSource 지시문은 코드 생성 도구나 중간 언어 생성 도구에서 주로 사용되는 고급 기능이며, 평범한 C# 개발에서는 자주 사용되지 않는다. 그러나 동적 코드 생성이나 컴파일러 도구를 개발하거나 디버깅 관련 도구를 작성하는 경우에 유용하게 사용될 수 있다.


#Const 지시문

    C#에서 #const 지시문은 컴파일 시간에 상수를 정의하는 데 사용된다. #const 지시문을 사용하여 정의된 상수는 컴파일 시간에 해당 값을 갖으며, 다른 코드에서 상수를 참조할 때 컴파일러는 해당 값을 대체한다. #const 지시문은 다음과 같은 형식으로 사용된다.

#define 심볼
#undef 심볼
  • #define 심볼: 심볼을 정의하고, 해당 심볼이 정의된 상태에서 컴파일러는 해당 #if 지시문의 조건을 충족시킨다.
  • #undef 심볼: 정의된 심볼을 해제하고, 해당 심볼이 정의되지 않은 상태에서 컴파일러는 해당 #if 지시문의 조건을 충족시키지 않는다.

    #const 지시문은 컴파일러에게 상수 값을 제공하여 코드를 유연하게 구성할 수 있는 도구이다. 주로 조건부 컴파일, 플랫폼 간 코드 분기 등에 사용된다.

#define VERBOSE

#if VERBOSE
   Console.WriteLine("Verbose output version");
#endif

조건부 컴파일

    조건부 컴파일(Conditional Compilation)은 컴파일 시간에 특정 조건에 따라 코드의 일부를 선택적으로 포함하거나 제외하는 프로그래밍 기술이다. 이를 통해 특정 플랫폼, 빌드 구성, 버전 등에 따라 다른 코드 경로를 실행하거나 특정 기능을 활성화할 수 있다. C#에서 조건부 컴파일은 #if, #else, #elif, #endif 지시문을 사용하여 수행된다. 이러한 지시문은 컴파일러에게 특정 조건을 판단하고 해당 조건이 충족될 때 코드 블록을 컴파일하도록 지시한다.

  • #if: 지정된 기호가 정의된 경우에만 코드가 컴파일되는 조건부 컴파일을 연다.
  • #elif: 앞에 있는 조건부 컴파일을 닫고 지정된 기호가 정의되었는지에 따라 새 조건부 컴파일을 연다.
  • #else: 앞에 있는 조건부 컴파일을 닫고 이전 지정된 기호가 정의되지 않은 경우 새 조건부 컴파일을 연다.
  • #endif: 앞에 있는 조건부 컴파일을 닫는다.

    다음은 조건부 컴파일의 기본적인 사용 방법이다.

#if 조건
    // 조건이 참일 때 실행되는 코드
#elif 다른_조건
    // 다른 조건이 참일 때 실행되는 코드
#else
    // 모든 조건이 거짓일 때 실행되는 코드
#endif

    조건은 불리언(Boolean) 값, #define으로 정의된 심볼, #undef로 정의 해제된 심볼 등을 사용하여 지정할 수 있다. #if 지시문은 조건이 참일 때 그 이후의 코드 블록을 컴파일하며, #elif는 이전 조건이 거짓이고 해당 조건이 참일 때 실행된다. #else는 모든 이전 조건이 거짓일 때 실행되는 코드 블록을 지정한다. #endif는 조건부 컴파일 블록의 끝을 나타낸다.

    조건부 컴파일은 특정 플랫폼 또는 빌드 구성에 따라 다른 코드 경로를 선택적으로 실행하고 싶을 때 유용하다. 이를 통해 코드의 가독성과 유지 관리성을 향상시킬 수 있다.

더보기

조건부 컴파일 또한, 논리 연산자와 비교 연산자를 이용할 수 있다.

영역 정의

    #region 지시문은 C# 코드에서 코드 영역을 정의하여 가독성을 향상시키는 데 사용된다. #region과 #endregion 사이에 있는 코드는 코드 편집기에서 접을 수 있으므로, 복잡한 코드를 논리적으로 그룹화하고 필요할 때 코드 영역을 접을 수 있다. #region 지시문은 다음과 같은 형식으로 사용된다.

#region 영역_이름
// 코드 영역
#endregion

   영역_이름: 영역에 대한 설명이나 식별을 나타내는 문자열이다. 이는 선택적으로 지정할 수 있다. 다음은 #region 지시문을 사용하여 코드를 영역별로 그룹화하는 예이다.

using System;

class Program
{
    static void Main()
    {
        #region Initialization
        // 초기화 코드
        #endregion

        #region Processing
        // 처리 로직
        #endregion

        #region Cleanup
        // 정리 코드
        #endregion

        // 나머지 코드
    }
}

    #region 블록은 #endregion 지시문으로 종료해야 한다. #region 블록은 #if 블록과 겹칠 수 없다. 그러나 #region 블록은 #if 블록에 중첩될 수 있고 #if 블록은 #region 블록에 중첩될 수 있다.

    #region 지시문은 코드의 일부를 표시하거나 숨길 때 사용되지만, 컴파일 동작에는 영향을 주지 않는다. 컴파일러는 #region과 #endregion 사이의 코드를 그대로 컴파일한다. 따라서 #region 지시문을 사용해도 코드의 동작이 변경되지 않는다. 이는 주로 코드의 구조를 시각적으로 표현하고, 코드를 논리적으로 조직화하여 유지 관리를 용이하게 하는 데 사용된다.


Pragma

    #pragma 지시문은 컴파일러에게 특정 동작을 수행하도록 지시하는 데 사용되는 지시문이다. C#에서 #pragma 지시문은 특정 컴파일러나 개발 환경에서만 지원되며, 다양한 용도로 사용될 수 있다. 일반적으로 #pragma 지시문은 컴파일러에게 컴파일 옵션을 설정하거나 동작을 변경하도록 요청한다. 여러 종류의 #pragma 지시문이 있으며, 지원되는 #pragma 지시문은 컴파일러나 개발 환경에 따라 다를 수 있다. 몇 가지 일반적인 #pragma 지시문 예제를 살펴보자.

   #pragma warning 지시문은 경고 관련 동작을 제어합니다. 특정 경고를 활성화하거나 비활성화하거나, 경고의 수준을 변경하거나, 경고 메시지를 사용자 지정할 수 있습니다.

#pragma warning disable 경고_코드
// 특정 경고를 비활성화

#pragma warning restore 경고_코드
// 특정 경고를 다시 활성화

#pragma warning suppress 경고_코드
// 특정 경고를 비활성화하고 이유를 지정

     #pragma checksum 지시문은 컴파일된 출력 파일의 체크섬 값을 설정한다. 이를 통해 출력 파일의 무결성을 검증할 수 있다.

#pragma checksum "파일_이름" "{GUID}" "체크섬_값"
// 출력 파일의 체크섬 값을 설정

     #pragma region과 #pragma endregion 지시문은 코드 영역을 정의하여 가독성을 향상시키는 데 사용된다. 코드 편집기에서 해당 영역을 접을 수 있다.

#pragma region 영역_이름
// 코드 영역

#pragma endregion
// 코드 영역의 종료

     #pragma strict 지시문은 더 엄격한 컴파일 동작을 요청한다. 주로 코드의 일관성을 강화하거나 특정 규칙을 강제로 적용하고자 할 때 사용된다.

#pragma strict
// 엄격한 컴파일 동작 활성화

 

    #pragma 지시문은 컴파일러나 개발 환경에 따라 다양한 용도로 사용될 수 있다. 사용 가능한 #pragma 지시문 및 지원되는 동작은 사용 중인 컴파일러나 개발 환경의 문서를 참조하는 것이 가장 좋다.


오류 및 경고 정보

    C#에서는 #error, #warning, #line 지시문을 사용하여 컴파일 시간에 오류, 경고 및 소스 코드의 라인 번호를 제어할 수 있다. 이러한 지시문은 주로 컴파일러에게 특정 메시지를 표시하거나 컴파일러 동작을 제어하는 데 사용된다.

    #error 지시문은 컴파일 시간에 오류를 강제로 발생시키는 데 사용된다. 이 지시문 다음에 오는 텍스트는 컴파일러 오류 메시지로 표시된다. 주로 조건에 따라 컴파일을 중단하고자 할 때 사용된다.

#if 조건
    #error "오류 메시지"
#endif

     #warning 지시문은 컴파일 시간에 경고를 표시하는 데 사용된다. 이 지시문 다음에 오는 텍스트는 컴파일러 경고 메시지로 표시된다. 주로 특정 조건이나 코드 부분에 대해 경고를 발생시키고자 할 때 사용된다.

#if 조건
    #warning "경고 메시지"
#endif

     #line 지시문은 컴파일러에게 소스 코드의 라인 번호를 지정하는 데 사용된다. 이를 통해 컴파일러에게 특정 소스 파일의 특정 라인에서 코드를 작성하는 것처럼 속일 수 있다. 주로 코드 생성 도구나 디버깅 시나리오에서 사용된다.

#line 라인_번호 "파일_이름"
// 소스 코드

#line 기본
  • 라인_번호: 지정할 라인 번호이다.
  • "파일_이름": 지정할 파일 이름이다.
  • 기본: 컴파일러에게 기본적인 소스 코드의 라인 번호와 파일 이름으로 돌아가라는 신호를 준다.

    #error, #warning, #line 지시문은 컴파일 시간에 컴파일러 동작을 제어하고 메시지를 표시하는 데 사용된다. 이를 통해 오류 및 경고를 강제로 발생시키거나 소스 코드의 라인 번호를 조작하여 컴파일러에게 추가 정보를 제공할 수 있다. 이러한 지시문은 주로 조건부 컴파일, 디버깅, 코드 생성 등의 시나리오에서 유용하게 사용된다.

더보기

   오류(Error)는 컴파일러가 코드에 심각한 문제가 있음을 감지한 경우 발생한다. 오류는 컴파일 과정에서 코드의 문법 오류, 타입 불일치, 참조 오류 등과 관련된 문제를 나타낸다. 컴파일러는 오류를 발견하면 해당 부분의 코드를 컴파일하지 않고 중단하며, 오류 메시지를 출력한다. 오류가 발생한 경우, 해당 오류를 수정해야만 코드를 성공적으로 컴파일할 수 있다.

   경고(Warning)는 오류보다는 덜 심각한 문제를 나타낸다. 경고는 코드의 잠재적인 문제나 권장사항에 대한 안내를 제공한다. 예를 들어, 사용하지 않는 변수, 잘못된 경로에 파일 저장, 잠재적인 null 참조 등과 같은 상황에서 경고가 발생할 수 있다. 경고는 컴파일러가 코드를 컴파일할 때 참고 사항으로 제공되며, 경고 메시지에는 경고의 원인과 해결 방법에 대한 정보가 포함될 수 있다. 경고는 코드의 실행에 직접적인 영향을 미치지 않지만, 코드의 품질을 향상시키고 잠재적인 문제를 파악할 수 있는 기회를 제공한다.

    오류와 경고는 주로 개발 환경의 통합 개발 환경(IDE) 또는 컴파일러에서 제공하는 출력 창이나 로그를 통해 표시된다. 개발자는 이러한 오류와 경고 메시지를 확인하고 코드를 수정하여 문제를 해결할 수 있다. 오류와 경고의 발생은 코드의 품질을 개선하고 안정성을 높이는 데 도움을 준다. 따라서 컴파일러가 제공하는 오류 및 경고 정보를 주의 깊게 확인하고 적절히 대응하는 것이 좋다.

Null 허용 컨텍스트

    Null 허용 컨텍스트(Nullable Context)는 컴파일러에게 코드에서 null 허용과 관련된 경고 및 오류를 제어하는 기능이다. "#nullable" 뒤에 아래와 같은 추가 지시문을 적어 상세한 제어가 가능하다.

  • "enable": null 허용 경고를 오류로 처리한다.
  • "warnings": null 허용 경고를 경고로 처리한다.
  • "disable": null 허용 경고를 비활성화한다.

   Null 허용 컨텍스트를 활성화하면 C# 컴파일러는 변수, 매개변수, 반환 값 등의 null 허용 여부를 검사하고 관련 경고를 표시한다. Null 허용 컨텍스트를 비활성화하면 이러한 경고를 억제할 수 있다.

  • #nullable disable: null 허용 주석 및 경고 컨텍스트를 disabled로 설정한다.
  • #nullable enable: null 허용 주석 및 경고 컨텍스트를 enabled로 설정한다.
  • #nullable restore: null 허용 주석 및 경고 컨텍스트를 프로젝트 설정으로 복원한다.
  • #nullable disable annotations: null 허용 주석 컨텍스트를 disabled로 설정한다.
  • #nullable enable annotations: null 허용 주석 컨텍스트를 enabled로 설정한다.
  • #nullable restore annotations: null 허용 주석 컨텍스트를 프로젝트 설정으로 복원한다.
  • #nullable disable warnings: null 허용 경고 컨텍스트를 disabled로 설정한다.
  • #nullable enable warnings: null 허용 경고 컨텍스트를 enabled로 설정한다.
  • #nullable restore warnings: null 허용 경고 컨텍스트를 프로젝트 설정으로 복원한다.

   Null 허용 컨텍스트를 사용하면 코드에서 null 허용과 관련된 잠재적인 오류를 사전에 파악하고 처리할 수 있다. 이를 통해 안정성이 향상되고 null 참조로 인한 예외 상황을 방지할 수 있다.

#Disable 및 #Enable 지시문(Visual Basic)

    #Disable 및 #Enable 지시문은 Visual Basic에서 사용되는 지시문으로, 특정 경고를 비활성화하거나 다시 활성화하는 데 사용된다. 이러한 지시문은 컴파일러에게 특정 경고에 대한 처리 방법을 지정할 수 있도록 한다.

    #Disable 지시문은 특정 경고를 비활성화하는 데 사용된다. #Disable 지시문 이후에 오는 코드 블록에서는 해당 경고가 발생해도 컴파일러가 경고를 표시하지 않는다.

#Disable 경고_코드
' 해당 경고가 발생해도 컴파일러가 경고를 표시하지 않음

' 코드 작성

#Enable 경고_코드
' 이후에 다시 해당 경고가 활성화됨

 

    #Enable 지시문은 이전에 비활성화된 경고를 다시 활성화하는 데 사용된다. #Enable 지시문 이후에 오는 코드 블록에서는 해당 경고가 다시 활성화되어 컴파일러가 경고를 표시할 수 있다.

#Enable 경고_코드
' 이후에 다시 해당 경고가 활성화됨

 

    #Disable 및 #Enable 지시문은 주로 컴파일 시 경고를 조절하거나 특정 코드 부분에서 경고를 무시하고자 할 때 사용된다. 경고를 일시적으로 비활성화하고 나중에 다시 활성화하는 것은 주의가 필요하며, 가능한 한 경고에 대한 이해와 적절한 대응이 필요하다. Visual Basic의 #Disable 및 #Enable 지시문은 경고 처리를 세밀하게 제어할 수 있는 기능을 제공하며, 코드의 품질과 안전성을 향상시키는 데 도움을 줄 수 있다.


주섬주섬

    지시문들은 프로그래밍 언어를 더욱 유연하게 활용하고, 코드의 가독성과 유지보수성을 향상시키는 데 도움을 준다. 또한, 특정 도구나 환경에 대한 커스터마이징이나 코드의 동작을 제어하는 데 유용하다. 그러므로 지시문은 프로그래머에게 코드 작성과 관리에서 유용한 기능을 제공하여 생산성과 품질을 향상시키는 데 기여한다.

참고

 

C# 전처리기 지시문

조건부 컴파일, 경고, null 허용 분석 등을 제어하는 다양한 C# 전처리기 지시문을 알아봅니다.

learn.microsoft.com

 

#Const 지시문 - Visual Basic

자세한 정보: #Const 지시문

learn.microsoft.com

 

Pragma 지시문 및 __pragma 및 _Pragma 키워드

pragma MSVC(Microsoft Visual C 및 C++)에서 사용할 수 있는 지시문을 설명합니다.

learn.microsoft.com

반응형

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 3. 변수와 입력문  (1) 2023.10.04
C# 2. 출력문  (0) 2023.09.10
C# 1. C# 들어가기에 앞서  (0) 2023.09.07
C# 특징과 비교  (1) 2023.09.01
C# 네이밍  (0) 2023.06.12

댓글