Embedded 실습/AT91SAM7S256

#ifndef 조건부컴파일

중동콜링 2013. 4. 16. 17:52

※조건부컴파일

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 부분은

전처리 언어가 아니므로 전처리단계에선 처리되지 않고 

그대로 남아있는것을 확인 할 수 있다.