파파비의 블로그

C# 전처리기 지시문, 전처리 상수 본문

개발/c#

C# 전처리기 지시문, 전처리 상수

N. Dave 2020. 5. 21. 09:02
반응형

전치리기 지시문은 스크립트들을 효율적으로 관리하는 데에 상당히 좋다.

 

예를 들면,

유니티로 앱을 개발하는데, ios와 안드로이드 2가지 버전이 필요하다면,

코딩상 약간의 다른 점들 떄문에 프로젝트를 2개로 늘려서 각각 관리해도 되지만

 

그렇게 되면 유지보수 측면에서 상당히 부담스러울 것이다.

새로 업데이트된 부분이 생기거나, 리팩토링한 부분들이 생기면 똑같이 한 번 더 적용해주어야하고

그러는 과정에서 버그의 리스크는 더욱 올라간다.

 

전처리기 지시문을 통해서는 하나의 스크립트로 여러가지 버전을 관리할 수 있도록 할 수 있다.

전처리기 지시문은 전처리 상수를 스크립트에 적어주고, 전처리 상수를 속성에 넣거나 빼는 것을 통해서

원할 때 마다 어느 특정부분은 컴파일되고, 어떤 부분은 컴파일 되지 않도록

지시할 수 있다.

 

전처리기 지시문은 #if  / #endif 을 통해 쓴다 

정확한 예시는 아래를 참고하면 된다.

 

전처리 상수를 활용한 예시

위 코드는 전처리상수 OUTPUT_LOG를 활용한 예시이다. 

OUTPUT_LOG가 전처리상수로 등록이 되어있는 상태이며, 그 상태에 위처럼 코딩된 스크립트를 실행하면

당연히 적용됐다는 내용이 콘솔에 찍힐 것이다.

반대로 스크립트는 저렇게 해놨지만 전처리상수가 프로그램에 등록되어 있지 않다면, 적용되지 않았다고 콘솔에 찍힐 것이다.

 

추가적으로 #else와 #elif도 가능하다 elif의 경우 추가적인 전처리 상수를 통해 case에 따른 분류도 가능하다.

 

마지막으로 전처리상수를 등록하는 방법에 대해 얘기를 해보자면, 매우 간단하다.

솔루션 탐색기에서 프로젝트를 우클릭 > 속성 > 빌드 > 조건부 컴파일 기호

여기에 전처리상수를 넣어주면 된다. 보통 처음에는 OUTPUT_LOG가 등록되어 있을 것이다.

 

솔루션 탐색기에서 프로젝트 우클릭 > 속성을 클릭

 

좌측상단에 빌드 > 일반 영역안에 조건부 컴파일 기호 안에 전처리 상수를 넣으면 적용이 된다.

 

 

마지막으로,

꼭 위에 처럼 속성 > 빌드 > 조건부 기호... 이과정이 귀찮을 수 있다.

그럴 경우 스크립트를 통해 적용할 수도 있다.

 

#define 과 #undef를 활용하면된다.

그런데 조건이 있다.

'스크립트 맨위'에 적어주어야 한다.

 

#define의 경우 조건부 컴파일 기호에 적용한다는 의미이며

#undef는 적용을 취소한다는 의미이다.

 

따라서 현재 예제는 OUTPUT_LOG만 전처리상수로 등록되어 있으니,

#undef OUTPUT_LOG만 의미있는 코드가 될 수 있고, 다른 전처리 상수를 넣는다면 큰 의미는 없을 것이다.

 

예시를 한번 살펴보자 

 

1. using보다도 위에, 맨위에 #define과 #undef를 활용했다. (그 아래에서 하면 오류가 뜬다)

2. 전처리기 지시문을 살펴보면 elif NEW_DEFINE의 글자들만 색이 들어가 있고, 다른 부분들은 회색인 것을 알 수 있다.

 - 이미 전처리기가 적용됐다는 얘기다.

3. OUTPUT_LOG는 전처리기에 등록이 됐었지만, undef를 통해 삭제되었다.

 

 

정말 마지막으로, 여기서 #undef 부분을 삭제하면 어떻게 될까? 

OUTPUT_LOG와 NEW_DEFINE이 다 적용된 상태에서는 어떤게 실행될까?

 

정답은 "OUTPUT_LOG" 부분이 실행되며, NEW_DEFINE부분은 실행되지 않는다.

상위에 있어서 먼저 적용되는 것이다. 

실제로 두 전처리기 상수의 위치를 바꾸면 코드상 더 일찍 나타난 NEW_DEFINE이 실행된다.

 

당연히 황당한 전처리기 상수 네이밍으로 개념상 혼돈이 와서 실수를 하지 않도록 하는게 필요할 것 같다.

 

반응형
Comments