조건부 컴파일
Programming/C 2013. 2. 15. 01:55 |#if, #elif, #else, #endif 를 이용한 조건부 컴파일
전처리 지시자 #if, #elif, #else, #endif 는 전처리기에게 조건을 제시하는 경우에 사용된다.
ex) #if CONDITION1
expression1
#elif CONDITION2
expression2
#else
expression3
#endif
"CONDITION1이 만족되면 expression1을, CONDITION2가 만족되면 expression2를, 이도 저도 아니면 expression2을 컴파일하라"
if~ else if 문장과 상당히 유사한 형태를 지니고 있음을 알 수 있다. 다만 위의 문장은 전처리기에 의해 처리되기 때문에
컴파일 해야 할 대상을 지정할 때 사용하게 된다.
※ #endif 는 꼭! 빼먹지 말고 넣어주어야 한다. "여기까지입니다." 라는 뜻이니!!
#ifndef, #endif 를 이용한 조건부 컴파일
ifndef == if not define(정의하지 않았다면)
: 헤더 파일을 마구마구 만들어서 포함(#include)해 가다 보면 문제가 발생하기 마련이다.
위의 코드는 count.h의 int 형 count를 중복 선언해서 일어나는 에러이다. (헤더 자체를 중복 포함하는 것이 문제가 되는 것은 아니다.)
해 결 책
첫 번째 방법
: 헤더 파일을 중복해서 포함하는 것을 막는 것이다.
└ 이것을 적용하기 위해서는 신경 쓸 일이 한둘이 아니다. 파일의 배치 자체를 바꿔야 할 수도 있다.
두 번째 방법
: 중복 포함하더라도 내부에 선언된 내용들이 한번만 선언 및 정의되게 하는 것이다.
└ 아주 간단한 처리를 통해서 적용이 가능하다. 실제로 많은 프로그래머들이 사용하는 방법이다.
● 헤더 파일의 포함 관계에서 발생하는 문제의 해결
: 조건부 컴파일은 헤더 파일을 중복 포함하더라도 내부에 선언된 내용들이 한번만 선언 및 정의되게 하는 것이다.
ex) #ifndef _COUNT_H_ → _COUNT_H_를 정의하지 않았다면
#define _COUNT_H_ → _COUNT_H_를 정의하고
int count = 0; → int형 변수 count도 선언하고
#endif → 끝낸다.
#ifndef _COUNT_H_ ~ #endif 는 다음과 같은 의미는?
: 만약에 _COUNT_H_ 를 정의하지 않았다면 컴파일 시 #endif 이전까지의 내용을 컴파일해라.
count.h헤더 파일을 이렇게 선언하면 위에 에러문제는 해결된다.
왜냐하면, 내부에 존재하는 내용은 한번만 선언 및 정의되기 때문이다.
그리고, #defile _COUNT_H_를 정의하는 목적은 오로지 조건부 컴파일을 위한 것이다.
더불어, _COUNT_H_ 는 헤더 파일 이름을 이용하여 만든 것이다. 조건부 컴파일을 위한 매크로를
정의하는 경우 어떤한 이름을 주건 상관 없지만 이름이 중복되어서는 안 될 것이다.
파일의 이름은 중복될 일이 없으므로, 이를 이용하는 것은 좋은 방법이고, 또 가장 보편화되어 있다.
지금까지의 내용을 종합해 보면 헤더 파일 선언 시 파일 내에 존재하는 모든 내용을 #ifndef와 #endif 문장으로
감싸는 것이 좋다는 결론을 내리게 된다.
언제 어떻게 중복 포함될지 모르는 일이기 때문이다.
'Programming > C' 카테고리의 다른 글
2차원 배열 동적할당. (2) | 2013.02.15 |
---|---|
fprintf와 문자열 형식 (0) | 2013.02.15 |
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |