ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전처리기 지시문(Preprocessor directives) - 2
    프로그래밍 언어/C & C++ 2020. 6. 27. 22:26

    첫번째 글에 이어서 나머지 지시문에 대해 설명합니다

     

    전처리 지시문에는 아래와 같은 종류가 있습니다.

    - Macro definitions (#define #undef)

    - Conditional inclusions (#ifdef #ifndef #if #endif #else #elif)

    - Line control(#line)

    - Error directive(#error)

    - Source file inclusion(#include)

    - pragma directive(#pragma)

    * predefined macro names( __something__)

     

    3. Line Control(#line)

     

    -#line

    보통 컴파일시 에러가 나게되면, 해당 소스 코드의 이름과 라인 넘버를 컴파일러에서 에러메시지로 줍니다. 이 두 가지를 모두 제어할 수 있는 지시문입니다. 

    #line number "filename"

    아래와 같은 코드가 있을 때, #line 지시문이 선언된 바로 아래줄을 10번 줄이라하고 에러가 난 줄을 보여줍니다.

     

    아래 주석처리 된 부분을 보시면 plus operation의 11번째 줄에서 에러가 발생했다는 것을 컴파일러가 보여주는 것을 알 수 있습니다.  

    int main(){
    	#line 10 "plus operation"
    	int a = 0;
    	a = 1 ++ 20; // Error!
    }
    
    /*
    plus operation:11:9: error: expression is not assignable
      a = 1 ++ 20;
          ~ ^
    1 error generated.
    compiler exit status 1
    */

     

    4. Error directive(#error)

     

    -#error 

    해당 지시문이 사용되었을 때, 컴파일 과정을 중단합니다. 

    아래와 같이 INF가 정의되어 있지 않다면 컴파일 과정을 중단하게하는 등의 용도로 사용할 수 있습니다.

    #ifndef INF
    #error INF should be defined!
    #endif

     

    5. Source file inclusion(#include)

     

    #include

     

    누구나 알고 있는 지시문 일겁니다. 사실 특별한 과정을 포함하는 것은 아닙니다.
    #include <header> 가 선언되면 그저 header라는 파일에 있는 내용들을 모두 복사 + 붙여넣기 할 뿐입니다.

    #include <iostream>이라고 선언하면, iostream 파일에 있는 모든 내용을 복사하여 해당 지시문이 있는 곳에 붙여 넣습니다.

     

    #include <header>
    #include "header"

    그런데 위와 같이 <>, "" 두 가지 방식으로 헤더 파일을 사용할 수 있습니다. 이 두가지의 차이가 무엇일까요?

    1. <> 
      - 컴파일러에서 준 옵션 (보통 -I)을 통해 유저가 지정해준 디렉토리에서 찾는다.

      - include 환경변수에 지정된 경로에서 찾는다.

    2. ""
      - #include 문이 포함된 소스 코드와 동일한 디렉토리를 찾는다.

      - 동일한 디렉토리에서 찾지 못하면 해당 디렉토리를 포함한 디렉토리에서 찾는다.

      - 컴파일러에서 준 옵션 (보통 -I)을 통해 유저가 지정해준 디렉토리에서 찾는다.

      - include 환경변수에 지정된 경로에서 찾는다.

     

    즉 ""를 통해 #include가 포함된 소스 코드가 있는 디렉토리를 찾은 후는 <> 와 동일하게 작동한다고 보면됩니다.

     

    이번 글에서는 전처리 지시문 중에 line control, error directive, source code inclusion 3가지를 다뤘습니다.
    다음 글에서는 pragma, predefined macro names를 다뤄보려고 합니다!
    틀린 부분이 있거나 오타가 있다면 댓글로 지적해주시기 바랍니다:)

    댓글

Designed by Tistory.