wellcome_공부일기

01.10. C++| 전처리기(Preprocessor)란? 본문

프로그래밍/C++

01.10. C++| 전처리기(Preprocessor)란?

ma_heroine 2020. 4. 29. 22:48

<목차>

1. 전처리기(Preprocessor)란?

2. 대표적인 전처리기(Preprocessor) 알아보기

   - The #define Preprocessor

   - Function-Like Macros

   - Conditional Compilation

 

 

전처리기(Preprocessor)란?

- 전처리기(Preprocessor)는 실제 컴파일이 시작되기 전에 컴파일러에게 정보를 사전 처리하도록 지시하는 지시사항이다.
- 모든 전처리기 지시문(Preprocessor Directives)은 #로 시작하며, 전처리기 지시문 앞에 공백 문자만 나타날 수 있다.

- 전처리기 지시문은 C++ 문장이 아니므로 세미콜론(;)으로 끝나지 않는다.
- 이미 모든 예에서 #include 명령을 보았듯이, 이 매크로는 헤더 파일을 소스 파일에 포함시키는 데 사용된다.
- #include, #define, #if, #else, #line 등과 같이 C++가 지원하는 전처리기 지시문의 수가 있다. 

-www.tutorialspoint.com/cplusplus/

 

 

 

 

대표적인 전처리기(Preprocessor) 알아보기

  - The #define Preprocessor

#define 전처리기 지시문은 상징 상수를 만든다. 상징 상수는 매크로라고 하며 지시의 일반적인 형태는 아래와 같다.

#define macro-name replacement-text

 

이 줄이 파일에 나타나면 프로그램이 컴파일되기 전에 해당 파일에서 매크로의 모든 후속 발생이 대체 텍스트로 대체된다.

#include <iostream>
#define MY_NUMBER1 9 
#define MY_NUMBER2 "hello" 

int main()
{
    using namespace std;
    
    cout << MY_NUMBER1 << endl;
    cout << MY_NUMBER2 << endl;
    
    return 0;
}

- 매크로는 대부분 대문자로 사용한다.

- 매크로는 스트링도 가능하다.

- MY_NUMBER1와 MY_NUMBER2를 각각  9와 "hello"로 교체해준다고 생각하면 된다.

 

 

 

 - Function-Like Macros

#define을 사용하여 다음과 같이 인수를 취할 매크로를 정의할 수 있다.

#include <iostream>
#define MAX(a,b) ((a>b) ? a:b)

int main()
{
    using namespace std;
    
    cout << MAX(2,3) << endl;
    
    return 0;
}

 

 

하지만, 복잡한 연산식 혹은 어떤 숫자가 나올지 모르기 때문에 이를 대비하여 괄호' () '를 이용해서 매크로를 확실히 구분할 수 있도록 한다. 

#include <iostream>
#define MAX(a,b) (((a)>(b)) ? (a):(b))

int main()
{
    using namespace std;
    
    cout << MAX(1 + 4,3) << endl;
    
    return 0;
}

 

#include <iostream>
#define MIN(a,b) (((a)<(b)) ? a : b)

int main () 
{
   using namespace std;
   int i, j;
   
   i = 100;
   j = 30;
   
   cout <<"The minimum is " << MIN(i, j) << endl;

   return 0;
}

 

 

사실, math 헤더파일을 이용하면 MAX 매크로를 사용하지 않아도 된다.

컴파일러마다 지원하는 헤더파일이 다른데 CLion은 현재 math.h 와 algorithm으로 맥스를 사용할 수 있다.  

#include <iostream>
#include <math.h> //standard library
#define MAX(a,b) (((a)>(b)) ? (a):(b))

int main()
{
    using namespace std;
    
    cout << std::max(1+3,2) << endl;
    
    return 0;
}

 

 

- Conditional Compilation

프로그램 소스 코드의 선택적 부분을 컴파일하는 데 사용할 수 있는 몇 가지 지침이 있다. 이 과정을 조건부 편찬이라고 한다.
조건부 전처리기 구조는 'if' 선택 구조와 매우 유사하다.

#include <iostream>
#define LIKE_APPLE 

int main()
{
    using namespace std;
    
#ifdef LIKE_APPLE 
    cout << "APPLE" << endl; //output : APPLE
#else  
    cout << "Orange" << endl;
#endif;

    return 0;
}

- #define이 매크로 네임을 뒤의 텍스트로 교체해주는 것은 맞지만 매크로만 존재할 경우 교체를 하지 않는다. 

- 또한 #define은 선언한 해당 파일 내에서만 유효 효력이 있어, 효력범위에 신경써서 프로그래밍을 해야 한다. 

- Conditional Compilation은 빌드하기 전에 매크로를 이용한 조건에 따라 컴파일이 다른 방식으로 하는 시작을 말한다. 

- 전처리기의 정의처럼 위의 #ifdef, #else, #endif 블락 내용이 이미 결정된 상태에서 컴파일이 시작된다고 생각하면 된다. 

 (예를 들어, 빌드 하기 전에 컴퓨터가 윈도우인지 리눅스인지 알고 시작하는 것처럼)

 

 

 

 

 

 

*해당 내용은 홍정모님의 따라 배우는 C++을 공부한 것을 토대로 작성되었습니다. 

*-www.tutorialspoint.com/cplusplus/의 내용을 참고하여 작성하였습니다. 

Comments