'#ifndef'에 해당되는 글 2건

  1. 2013.02.15 조건부 컴파일(Conditional Compilation)
  2. 2013.02.15 조건부 컴파일

#if... #endif : 참이라면

: if 매크로는 '참'이냐 '거짓'이냐를 기준으로 동작.






#ifdef... #endif : 정의되었다면

:ifdef 매크로는 "정의되었느냐(참)", "정의되지 않았느냐(거짓)"를 기준으로 동작.




이 매크로는 정의되었느냐를 판단하기에 옆에 참 거짓을 의미하는 1과 0을 생략한다.




#ifndef...#endif : 정의되지 않았다면

※ #ifndef는 헤더파일의 중복포함을 막기 위해 주로 사용이 된다.





#if와 함께 사용할 수 있는 "defined" 연산자

: defined 연산자는 매크로 #if문의 구성에 활용할 수 있는 연산자이다. 이 연산자의 덕분으로 #if문에서도 매크로의 정의 유무를 확인할 수 있게 된다.




defined 연산자 덕분에 코드가 한결 간결해졌다.




#undef : 이전에 정의된 매크로를 무효화




매크로 DATE를 무효화시키고 있다. 무효화시킨다는 것은 전처리기의 기억에서 지우는 것을 의미한다. 그런데 앞서 매크로  DATE가 정의된 적이 없다. 하지만 이는 오류가 아니다.

#undef는 정의되지 않은 매크로의 무효화 명령에도 오류를 발생시키지 않기 때문이다. 따라서 정의 유무가 확실하지는 않지만, 무효화시켜야 할 매크로가 있다면 언제든지 #undef 명령문을 구성하면 된다.


※ 매크로의 무효화 과정 없이도 재정의는 가능하다. 그러나 경고메시지가 발생하므로 무효화 과정을 거치는 것을 권장.


Posted by scii
:

조건부 컴파일

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
: