#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를 반환한다.
댓글 없음:
댓글 쓰기