[C#] #define을 C#에서도 쓰고 싶으세요?

c++ 프로그래밍에 익숙하신 분은
Preprocessor Definitions를 많이 활용하셨을 겁니다.

Preprocessor위 그림처럼 C++ 프로젝트 셋팅에서

Preprocessor Property Pages에 가면
Preprocessor Definitions 를 추가할 수 있는데요.
위 프로젝트는 MFC 프로젝트이고 컴파일 환경은 Windows 32bit 이기 때문에 기본으로 WIN32, _WINDOWS가 포함되었고
디버그 모드라 _DEBUG 가 추가되어 있습니다.

   1: #ifdef _DEBUG
   2:     LOG(_T("어쩌고 저쩌고 로그"));
   3: #

그래서 위와 같이 디버그 모드일 때만 로그를 남기게 할 수도 있었죠.


그럼 이제부터 C# 이야기를 해보겠습니다.

C#에서 C++에서 처럼 Preprocessor를 이용해서 predefined condition을 이용하는 분들은 많이 보질 못한 것 같습니다.

csharp property

C# 프로젝트에서도 Build 탭에 보시면 Conditional compilation symbols 이라는 기능이 있습니다.

그리고 기본적으로 디버그 모드이기 때문에 DEBUG, TRACE 가 이미 선언되어 있구요.

그렇다면 이미 선언되어 있는 DEBUG를 사용하여 디버그 모드일 때만 로그를 찍는 기능을 하고 싶은 순간이 찾아왔습니다.

   1: #if DEBUG
   2:             Console.WriteLine("Log....");
   3: #endif

C++ 처럼 #ifdef 대신 #if를 쓰는 것만 틀리고 사용법은 거의 비슷합니다.

근데 RELEASE 모드에서도 로그를 남기고도 싶으면 어떻게 할까요?
일단 프로젝트 프로퍼티에 빌드 탭에서 Conditional compilation symbols에 LOG를 추가하시구요

   1: #if (DEBUG && LOG)
   2:             Console.WriteLine("Debug, Log...");
   3: #endif
   4:  
   5: #if (!DEBUG && LOG)
   6:             Console.WriteLine("Release, Log...");
   7: #endif
   8:  
   9: #if LOG
  10:             Console.WriteLine("Log....");
  11: #endif


위와 같이 사용하시면, 디버그일 경우 로그 남기는 것, 릴리즈일 경우 로그 남기는 것, 둘 다 남기는 것을 구분지어서 사용할 수 있겠죠?

#if
#else
#elif
#endif
#define
#undef

그리고 위와 같은 지시자를 사용할 수 있는데요.
주의 할 것은 C++은 코드 중간에도 #define을 할 수 있지만
C#에서는 코드에서 가장 상단에서만 #define을 할 수 있습니다.

   1: #define TEST
   2:  
   3: using System;
   4:  
   5: #define TEST2

위의 코드에서는 1번 라인의  #define은 가능하지만, 5번 라인은 아래와 같은 컴파일 에러를 일으킵니다.

Error    1    Cannot define/undefine preprocessor symbols after first token in file


위와 같은 컴파일러의 기능을 사용하면 편리한 점이 많으니까, 프로젝트 하실 때 참고하세요~

chaoskcuf
프로그래밍/TIP& Study 2009/03/10 11:02

트랙백 주소 : http://chaoskcuf.com/trackback/189

댓글을 달아 주세요

  1. 핵앤슬래쉬 2009/03/14 17:22  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.

Powerd by Textcube, designed by criuce
rss