상세 컨텐츠

본문 제목

전처리기(preprocessor)

C++/기본

by nowpassion 2008. 5. 1. 11:40

본문

   1. 전처리기(preprocessor)란?
      - 컴파일전에 행해지는 동작을 정의

   2. 전처리기의 종류?
      - 기호상수
      - 매크로
      - 전처리기 지시어의 조건적 실행

   3. 선언
      - #으로 시작, 공백문자만 전처리기 지시어 앞에 나타날 수 잇다.

   4. #include
      - 특정한 파일의 복사본을 지시어 위치에 포함시킨다.
      - <> : 보통 기본 컴파일러의 기본 라이브러리
      - "" : 사용자 정의 라이브러리

   5. #define(기호상수)
      - #define PI 3.14159
      - 한번 정의된 기호상수는 본문내에서 변경될 수 있다.
      - 범위는 정의된 본문내에서만...
      - 추가적인 메모리를 할당 하지 않는다.

   6. #define(매크로)
      - 매크로도 컴파일 전 치환 텍스트로 변환되어 사용
      - 매크로의 인수는 타입과 관계없다. 단지 텍스트를 변환해 줄 뿐이다.
      - #define CIRCLE_AREA(x) (PI * (x) * (x))
      - #define CIRCLE_AREA(x) (PI * x * x)일 경우 문제가 생길 수 있다.
      EX) CIRCLE_AREA(c+2)이면 단순 텍스트 변환이므로
      PI * c+2 * c+2가 되므로 연산 우선순위에 의해  *가 먼저 연산이 일어난다.
      - 매크로에 의해 함수를 직접 호출하는 방식이 아닌 텍스트 치환으로 이루어지기 때문에 메모리가 덜 쓰여진다는 것이다.
      - 매크로가 커지면 치환되는 양이 많아지므로 프로그램이 커진다는 단점이 있다.
      - 그러므로 inline함수를 통해 적절한 균형을 잡을 수 있는 케이스라고 할 수 있다.

   7. #undef
      - define을 해제해준다.

   8. #ifdef, ifndef, endif, elif, else, if(조건부 컴파일)
      - ifdef(if define), ifndef(if !define), elfi(else if)

   9. 미리정의된 기호상수
      - __LINE__ : 현재 소스 코드 줄의 줄 번호
      - __FILE__ : 파일 이름
      - __DATE__ : 컴파일 된 날짜
      - __STDC__ : 프로그램이 ANSI C표준을 따르는지 나타냄
      - __TIMESTAMP__ : 소스 파일의 최종 변경 날짜와 시간
      - __TIME__ : 컴파일 된 시간을 리턴

  10. 예제
      /*5.cpp*/
      /* 전처리기 예제 */
      #include <iostream>

      /* KILL이 정의되어있지 않으므로
         본문에서 에러 발생일어난다.  */
      #ifdef KILL
              #define KILL 0
      #endif

      /* KILL이 정의되어 있지 않으면
         KILL을 0으로 정의한다. */
      #ifndef KILL
              #define KILL 0
      #endif

      using std::cerr;
      using std::cout;
      using std::endl;
            
      int main()
      {
          int x=3;
          /*주석 대신 사용할 수 있는 방법*/
          #if 0
              cout << "컴파일 되지 않는다." << endl;
          #endif
        
          #if 1
              cout << "컴파일 된다." << endl;
          #endif

         /* #ifdef를 DEBUG로 이용하는 방법 */
         #ifdef DEBUG
                cerr << "Variable is x" << x << endl;
         #endif
       
          cout << KILL << endl;
        
          return 0;
      }


관련글 더보기