게임학원, 게임프로그래머 취업 전문 교육기관 DirectX11/12 자체엔진 게임개발과정,서버프로그래밍,자료구조,알고리즘,유니티,언리얼 게임학원, 언리얼학원 전처리문의 종류
본문 바로가기

전처리문의 종류

1. 전처리문


 실제 컴파일 과정이 일어나기 전에 처리되는 문장을 의미합니다.

즉, 사용자가 작성한 코드를 컴파일 하기 전에 각 전처리문이 지시하는 내용을 수행 한 뒤에

컴파일 과정이 일어나게 됩니다.


2. 전처리문의 종류


 전처리문은 항상 # 으로 시작합니다. 다음 설명하는 전처리문은 ANSI 표준 C 전처리문에 의한 내용입니다.


     • 조건처리 기능          : #if, #ifdef, #ifndef, #else, #elif, #endif

     • 파일처리 기능         : #include

     • 에러처리 기능         : #error

     • 정의 기능             : #define

     • 디버깅 기능           : #inline

     • 컴파일 옵션 제어 기능 : #pragma


3. 전처리문 특징


1. #include

     헤더파일 또는 외부 소스파일을 포함시킬 때 사용합니다.

#include <stdio.h>
#include <Windows.h>

   

2. #define

     정의한 구문을 다른 형태로 치환하기 위한 매크로입니다.

     

#define VALUE 0

 

 

     이후 VALUE 라는 구문을 쓰는 곳은 전부 0 으로 치환됩니다.


#define SUM(a, b) (a+b)

int main()
{
    int iReturn = SUM(46);

    return 0;
}

     이와 같은 형태를 매크로 함수라고 합니다.

     함수를 사용하기 위해서 스택메모리를 할당 하는 것이 아닌

     SUM(a, b) 의 구문을 사용하면, (a+b) 형태로 코드를 치환하게 됩니다.


3. #undef

     #define 으로 정의해놓은 매크로를 무시하는 기능입니다.

#define SUM(a, b) (a+b)

int main()
{
    int iReturn = SUM(46);

#undef SUM(a, b)    
    iReturn = SUM(510); // 컴파일 오류 발생 (SUM 매크로가 존재하지 않음)

    return 0;
}

   


4. #if, #endif

     #if 뒤에 값이 0 또는 0이 아닌 값이냐에 따라서, #ifendif 사이에 있는 코드가

     컴파일 시에 포함 될지 안 될지 결정합니다.

     참(0이 아닌 값) 일 경우에는 컴파일 시에 포함, 거짓(값이 0) 인 경우 컴파일 되지 않음.

#define VALUE 0

#if VALUE
void hiddenfun()
{
    std::cout << "hide and seek" << std::endl;
}
#endif

     위 코드에서 VALUE 가 0으로 치환되기 때문에, #if 0 와 같습니다. 0 은 거짓으로 판별되기 때문에

     hiddenfun() 함수는 컴파일 되지 않을 것입니다.


5. #ifdef, #endif

     #ifdef 뒤에 값이 정의 되었는지 아닌지에 따라서, #ifdefendif 사이에 있는 코드가

     컴파일 시에 포함 될지 안 될지 결정합니다.


     #ifdef 다음에 오는 구문이 이미 정의되어있는 매크로라면 컴파일 시에 포함

     #ifdef 다음에 오는 구문이 정의되어있는 매크로가 아니라면 컴파일 시에 미포함


6. #ifndef, #endif

     #ifndef 뒤에 값이 정의 되었는지 아닌지에 따라서, #ifndef#endif 사이에 있는 코드가

     컴파일 시에 포함 될지 안 될지 결정합니다.


     #ifndef 다음에 오는 구문이 이미 정의되어있는 매크로라면 컴파일 시에 미포함

     #ifndef 다음에 오는 구문이 정의되어있는 매크로가 아니라면 컴파일 시에 포함


7. #ifndef 와 #define을 통한 헤더 중복참지 방지

#ifndef GLOBAL
#define GLOBAL

// Source Code 작성

#endif

     GLOBAL 이라는 매크로가 정의되어 있지 않을 때에만 해당 소스코드를 컴파일 하게 됩니다.

     한번 이상 포함된 이후에는 GLOBAL 이라는 매크로가 처음 정의가 된 이후기 때문에

     중복해서 코드를 포함 시킬 수 없게 됩니다.

     주로 C 방식에서 사용하는 방법이며, C++ 에서는 간편하게 #pragma once 라는 매크로가 제공됩니다.


8. #pragma

     #pragma 는 컴파일러마다 고유하게 사용하도록 지정한 명령어 입니다.

     따라서 그 종류는 컴파일러마다 다릅니다.


     대표적인 구문으로는 #pragma once 가 있으며, 한번 포함된 헤더파일은 중복해서 포함되지 않도록

     컴파일러에게 지시하는 명령어입니다.


9. #error

     소스 라인에 직접 에러 메세지를 출력합니다. 즉, 전처리기가 #error 문을 확인하면 그 즉시

     컴파일을 중단하고, 에러 메시지를 출력합니다.

     

#ifndef __cplusplus

#error C++ compiler required

#endif


10. #line

     #line 전처리문은 __LINE__, __FILE__ 매크로를 재정의 합니다.

     __LIINE__ 과 __FILE__ 은 미리 #define 으로 정의되어 있는 매크로로써

     __LINE__ 은 현재 진행하고 있는 코드의 줄 번호를 반환하며, __FILE__ 은 현재

     컴파일 된 파일의 이름을 반환합니다.

    cout << __FILE__ << endl;
    cout << __LINE__ << endl;

#line 1 "myapp.cpp"
    
    
cout << __FILE__ << endl;
    cout << __LINE__ << endl;

     

     

- by Raimondo  


'정보 & 소식 > C, C++' 카테고리의 다른 글

[Effective C++] 클래스의 생성  (0) 2016.05.18
배열과 포인터  (0) 2016.04.28
포인터와 운영체제  (0) 2016.04.28
C언어 포인터  (0) 2016.04.28
C언어 기본 자료형  (0) 2016.04.28