2015. 2. 26.

[C++]#ifdef...#endif, #ifndef...#endif, #ifdef...#else...#endif

 특정 조건에 따라서 다른 코드를 컴파일하고 싶은 경우가 있다. 예를 들면 1으로 설정하면 A라는 코드가 컴파일되고, 1이 아닌 경우에는 B라는 코드가 컴파일되도록 하고 싶다. 이럴 경우 사용하면 좋은 것이 바로 #ifdef...#endif 이다. #ifdef...#endif는 여러 라이브러리에서 자주 사용되는 만큼 한 번 이해하고 넘어가는 것이 좋다. 간단하게 이해할 수 있으므로 이번 기회에 짚고 넘어가자.


#ifdef...#endif

 3D 공간에서 정점을 나타내는 구조체를 만들고자 한다. 만약 색상값이 있는 경우에는 이 구조체에 색상값을 나타내는 변수가 필요하지만, 색상값이 없는 경우는 색상값을 나타내는 변수가 필요없다. 그래서 색상값이 존재하는지 여부를 사용자가 #define을 통해 지정하면 컴파일러가 알아서 색상값을 나타내는 변수를 넣거나 빼도록 만들고 싶다. 이를 어떻게 처리할지 알아보자.

 먼저 색상값이 있는 정점이라고 선언해보자.
 보통 우리는 #define을 매크로 함수를 만들고자 사용한다. 혹은 숫자 형태의 상수를 변수명처럼 사용하고 싶을 때 자주 사용한다. 예를 들면 DirectX9에서 PI 값은 다음과 같이 정의되어 있다.
 #define은 전처리 단계에서 처리되므로 전처리 과정에서 D3DX_PI는 모두 ((FLOAT)  3.141592654f)으로 치환될 것이다. 그렇다면 위의 경우처럼 #define VERTEX_WITH_COLOR와 같이 선언된 경우 VERTEX_WITH_COLOR를 무엇이란 말인가? 아무런 값으로도 정의내리지 않았는데, 이를 어떻게 설명해야 하나? 참고로 #define 다음에 나오는 VERTEX_WITH_COLOR와 같은 것을 Identifier라고 부른다. C++ 컴파일러는 이 경우 다음과 같이 해석한다.
 그러면 처음 말한 것처럼 색상값에 따라 구조체를 다르게 설정할 수 있도록 코드를 완성해보자.
 #ifdef를 사용하고 #endif를 사용하지 않으면 컴파일 에러를 일으킨다. 반드시 #endif를 사용하여 어느 영역까지 #ifdef에 해당하는 범위인지 설정하도록 하자.


#ifndef...#endif

 #ifdef...#endif에 대해 이해하고 있다면 #ifndef는 따로 설명할 필요가 없다.
 #ifdef가 identifier가 설정되었는지를 묻는다면 #ifndef는 identifier가 설정되지 않았는지를 묻는다. n이 'and'를 의미하는 것이 아니라 'not'을 의미한다. 구체적인 코드는 생략해도 될 것같다.


#ifdef...#else...#endif
 if...else 문을 사용하는 것과 유사하게 사용하면 된다.


정리하면

  • #ifdef...#endif를 사용하여 조건부 컴파일이 가능하다.
  • #ifdef 'identifier' 형태로 선언하면 #ifdef 'identifire'는 TRUE를 반환한다.

댓글 없음:

댓글 쓰기