조건부 컴파일은 정해진 조건에 따라서 코드의 컴파일 여부를 제어하는 전처리기.
WinAPI용 코드를 리눅스에서 사용 제한하게 하는 것처럼 특정 플랫폼이나 OS에 특화된 코드를 구분하는 경우.
디버깅이나 테스트 코드 용도로 추가된 코드를 구분하는 경우.
#ifdef or #if/#elif/#else, 그리고 #endif를 이용하여 조건부 컴파일을 사용할 수 있음.
#ifdef 매크로
/* 코드 */
#elif defined 매크로
/* 코드 */
#else
/* 코드 */
#endif
#if 값 or 식
/* 코드 */
#elif 식
/* 코드 */
#else
/* 코드 */
#endif
#if defined 매크로
/* 코드 */
#endif
defined를 사용하면, #if를 사용했을 때보다 복잡한 조건을 사용할 수 있으며, 가독성을 위해서 괄호를 사용해 논리적 단위별로 묶는 것이 좋음.
위 매크로들은 해당 매크로가 정의된 경우에만 코드를 컴파일하는 것으로, 매크로가 정의되지 않은 경우에 대해서 #ifndef를 사용해야 함. 필자는 헤더 파일이 중복으로 포함되었을 때 이를 확인하고 방지하는 용도로 사용함.
#ifndef 매크로
/* 코드 */
#endif
[참고]
__DATE__ : 컴파일 시점의 날짜
__TIME__ : 컴파일 시점의 시각
__FILE__ : __FILE__ 매크로가 사용된 헤더나 소스 파일
__LINE__ : __LINE__ 매크로가 사용된 라인 넘버
해당 매크로는 컴파일러에서 제공.
컴파일러별 옵션 지정 방식(VC++, GCC)
Visual Studio에서는 프로젝트 > 속성 > C/C++ > 전처리기 > 전처리기 정의에서,
GCC는 'gcc 소스파일 -D매크로이름/ -D매크로이름=값'으로 컴파일 옵션을 지정하여 컴파일할 수 있음.
'Programming Language > C,C++' 카테고리의 다른 글
C, C++] 이중 포인터를 이용해 2차원 배열 사용하기 (2) | 2018.05.16 |
---|---|
C, C++] stdafx.h와 C2065(선언되지 않은 식별자입니다.) (0) | 2018.05.15 |
C, C++] 매크로 정의, 해제 (0) | 2018.05.06 |
C,C++] Visual Studio와 컴파일러 (0) | 2018.02.18 |
C++] 공백을 포함하는 문자열 여러 줄 입력 받기 (0) | 2018.02.12 |