'조건부 컴파일'에 해당되는 글 1건

  1. 2013.02.15 조건부 컴파일

조건부 컴파일

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
Posted by scii
: