728x90

전처리기는 몇가지 지시자를 제공한다.

#undef 지시자는 이전에 이루어진 #define 정의를 취소한다.

#if, #ifdef, #ifndef, #else, #elif, #endif 지시자들을 사용하면 여러코드중에서 어느 코드를 컴파일할 것인지 지정할 수 있다.

#line 지시자를 사용하면 라인과 파일정보를 재설정할 수 있다.

#error 지시자를 사용하면 에러 메시지를 발행할 수 있다.

#pragma 지시자를 사용하면 컴파일러에게 지시를 내릴 수 있다.

 

#undef 지시자

#undef 지시자는 이전에 이루어진 #define 정의를 무효화 한다.

ex)

#define LIMIT 400

#undef LIMIT

이전의 정의를 제거한다. 원한다면 LIMIT를 새로운 값으로 재정의 할 수 있다. LIMIT가 이전에 저으이되어 있지 않아도 #undef를 사용할 수 있다.

 

#define 매크로가 영향을 미치는 범위는 파일에서 자신의 정의된 위치에서 부터 #undef 지시자에 의해 취소되는 위치까지 또는 파일의 끝까지이다. 파일에서 #define 위치는, 그 매크로가 헤더파일을 통해 포함될 경우, #include 지시자의 위치에 의해 결정된다.

 

__DATE__ 와 __FILE__ 과 같은, 미리 정의된 매클들은 언제나 정의된 것으로 간주되기 때문에, 사용자가 정의르르 취소할 수 없다.

 

조건부 컴파일

지시자들을 이용하여, 컴파일 할 때 조건에 따라 코드 또는 정보의 블록을 받아들이거나 무시하라고 컴파일러에게 지시할 수 있다.

 

#ifdef, #else, #endif 지시자

ex)

#ifdef MAVIS

            #include "horse.h"                   //MAVIS가 #define 으로 정의된 경우

            #define STABLES 5

#else

           #include "cow.h"                     //MAVIS 가 #define 으로 미정의된 경우

           #define   STABLES 15 

 

 

#ifdef 지시자는 뒤에오는 식별자(MAVIS)가 전처리기에 의해 정의된 경우에, 그다음 #else 또는 #endif 둘중 하나가 먼저 나타나는 위치까지 모든 전처리기 지시자와 모든 C코드를 컴파일 하라고 지시한다. 식별자(MAVIS)가 미정의된 경우에 #else 가 있으면, #else 부터 #endif 위치까지 모든것을 처리한다.

 

#ifndef 지시자

#ifndef는, #ifdef와 마찬가지로, #else 와 #endif와 함께 사용가능하다. #ifndef는 그것을 뒤따르는 식별자가 정의되지 않았는지(not defined) 묻는다. #ifndef는 #ifdef의 부정이다. 이 지시자는, 어떤 상수가 이전에 정의되지 않은 경우에, 그 상수를 정의하는데 사용된다.,

ex)

#ifdef SIZE

       #define SIZE 100

#endif

 

일반적으로 위와 같은 형식은, 각각 하나씩 정의가 들어있는 여러개의 헤더 파일을 포함할 경우에, 동일한 매크로가 중복으로 정의되지 않도록 하는데 사용한다.

 

포함되는 많은 파일들이 다른 파일들을 또 다시 포함하고 있기 때문에 파일을 한번이상 포함시키는 일이 생긴다. 포함되는 파일들에 나타나는 구조체 데이터형의 선언과 같은 항목들은 한 파일에서 오직 한번만 나타나야 한다. C헤더 파일들은 중복 포함되는 것을 피하기 위해 #ifdef 테크닉을 사용한다. 

 

#if, #elif 지시자.

#if 다음에오는 상수 표현식이 0이 아니면 참으로 간주된다. C의 관계 연산자, 논리 연산자를 함께 사용할 수 있다.

ex)

#if SYS == 1

#include "ibm.h"

#endif

 

#elif지시자를 사용하여 if-else 신택스를 확장할 수 있다.

ex)

#if SYS == 1

        #include "ibmpc.h"

#elif SYS == 2

        #include "vax.h"

#elif SYS == 3

        #include "mac.h"

#else

        #include "general.h"

#endif

 

어떤 이름이 정의되어 있는지 테스트하는 방법

#ifdef VAX

#if defined (VAX)

위에서 defined는 전달인자가 정의되어 있으면 1, 정의되어 있지 않으면 0을 리턴하는 전처리기 연산자이다. #elif와 함께 사용할 수 있어 활용도가 높다.

ex)

#if defined (IBMPC)

      #include "ibmpc.h"

#elif defined (VAX)

      #include "vax.h"

#elif defined (MAC)

      #include "mac.h"

#else

      #include "general.h"

#endif

위 라인들을 VAX컴퓨터에서 사용한다면, #define VAX 라인을 사용하여 파일의 어딘가에 미리 VAX가 정의되어 있어야 한다.

 

조건부 컴파일 기능의 한가지 용도는, 프로그램의 이식성을 높이는 것이다. 파이르이 시작 위치에 놓여있는 몇가지 중요한 정의들만 간단하게 변경함으로써, 다른 기종의 시스템에 적합한 다른 파일들을 포함시킬 수 있고, 다른 값들을 설정할 수 있다.

 

미리 정의된 매크로

C 표준은 미리 정의된 여러개의 매크로들을 제공한다.

        매크로                                                                           의미

       __DATE__                                                 전처리기가 수행된 날짜를 나타내는 "Mmm dd yyyy"형식의                                                                             문자열 리터럴

        __FILE__                                                  현재 소스코드 파일의 이름을 나타내는 문자열 리터럴

       __LINE__                                                 현재 소스코드 파일에 있는 라인 번호를 나타내는 정수형 상수

       __STDC__                                                컴파일러가 C표준을 따른다면 1로 설정

       __STDC_HOSTED__                                  호스트 환경이면 1, 그렇지 않으면 0으로 설정

     __STDC_VERSION__                                    C99이면 199901L로 설정, C11이면   201112L로 설정

     __TIME__                                                   전처리가 수행된 시각을 나타내는 "hh : mm : ss " 형식의 문자열                                                                      리터럴

 

#line, #error

#line 지시자를 사용하여 __LINE__과 __FILE__ 매크로가 보고하는 라인 번호와 파일 이름을 다시 설정할 수 있다.

ex)

#line 1000                                //현재 라인 번호를 1000으로 설정한다.

#line 10 "cool.c"                         //라인번호는 10, 파일이름은 cool.c로 다시 설정한다.

 

#error 지시자는, 전처리기에게 지시자에 있는 텍스트를 에러 메시지로 표시하라고 지시한다.

ex)

#if __STDC_VERSION__ != 20112L

#error NOT C11

 

#endif

 

 

 

#pragma

#pragma를 사용하면, 소스코드 안에 직접 컴파일러 지시사항을 넣을 수 있다. Pragma 지시어를 이용하면 하드웨어나 운영체제와 관련된 특정한 기능과 관련된 기능을 컴파일러에게 알려줄 수 있습니다.

728x90

'Programming > C' 카테고리의 다른 글

C라이브러리  (0) 2019.07.17
인라인 함수 와 _Noreturn 함수  (0) 2019.07.17
파일 포함 시키기 : #include  (0) 2019.07.17
C #define에 전달인자 사용하기  (0) 2019.07.10
C 전처리기와 C 라이브러리  (0) 2019.07.10

+ Recent posts