#ifndef 조건부컴파일
※조건부컴파일
C언어는 다양한 환경에서 사용되기 때문에
운영체제나 컴파일러에 따라 일부 함수가 없는 경우도 있으므로,
특정 조건에 만족할 때만 실행되도록 전처리에서 걸러낼 수 있다.
조건부 컴파일에 사용되는 전처리기 지시자는 #if ~ #elif ~ #else ~ #endif와
#ifdef ~ #endif, #ifndef ~ #endif가 있다.
① #if ~#elif ~#else ~#endif
if - else if - else 문과 같은 형식으로 if와 elif에는 조건식을 달 수 있다.
② #ifdef ~ #endif
#ifdef는 "if defined"를 줄여쓴 것으로
#ifdef 지시자 뒤에 매크로 이름이 선언되어 있으면 전처리 과정을 수행한다.
③ #ifndef ~ #endif
#ifndef는 "if not defined"를 줄여쓴 것으로
#ifndef 지시자 뒤에 매크로 이름이 선언되어 있지않으면 전처리를 수행한다는 뜻이다.
다음 소스로 헤더파일에 자주 사용되는 #ifndef의 활용법을 살펴보자.
62라인 ⓐ에서 ASSEMBLY가 정의 되어있지 않으면 #else 윗부분인 63, 64번 라인이 실행이 된다.
1747라인에서 AT91_CAST()부분은 64번라인 ⓒ에서 정의된대로 ①~②처럼
(AT91_CAST(AT91_REG *)) -> (AT91_REG *)로 수정이 된다.
전처리 과정을 거치면
AT91SAM7S256.h에서 참고해서
*AT91C_PIOA_PER = 1; 이
*((AT91_REG *) 0xFFFFF400) = 1;
로 바뀐 것을 확인할 수 있다.
typedef volatile unsigned int AT91_REG 부분은
전처리 언어가 아니므로 전처리단계에선 처리되지 않고
그대로 남아있는것을 확인 할 수 있다.