전처리기 지시문
#define , #error, #if / #elif / #else 및 #endif / #ifdef와 #ifndef
전처리기 지시문은 일반적으로 소스 프로그램을 쉽게 변경하고 여러 실행 환경에서 쉽게 컴파일할 수 있도록 하기 위해 사용된다.
전처리기(=선행처리)란 컴파일 이전의 처리를 의미하고 소스파일은 컴파일러에 의해 컴파일 되기 이전에 이 전처리기 단계를 거친다.
◎ #define 지시문
이 #define 지시문은 세 부분으로 나뉜다.
#define | PI | 3.1415 |
지시자 | 매크로 | 매크로 몸체 |
많이 쓰이는 PI로 예시를 들어보면 코드에서 PI라는 이름(매크로)이 나오면 3.1415(매크로 몸체)로 바꾸라는 명령과 같다.
#define PI 3.1415
int function_before()
{
int angle;
angle = 180 * PI;
}
int funcint_after()
{
int angle;
angle = 180 * 3.1415;
}
전처리기의 단계를 거치면 코드 상에서 function_before의 내용을 function_after로 바꾼다.
이렇게 상수를 매크로로 정의한 것을 매크로 상수라고 부르고
상수가 아닌 함수로 정의해 놓은 것을 매크로 함수라고 부른다.
◎ #if, #elif, #else 및 #endif 지시문
#if... #endif는 조건부 코드 삽입을 위한 지시문이다.
소스파일의 각 #if 지시문은 #endif 지시문과 일치해야 하며 #if와 #endif 사이에는 여러개의 #elif가 나올 수 있지만 #else는 하나만 사용할 수 있다.
#define ENABLE 1
#define IMPOSSIBLE 0
int main()
{
#if ENABLE
cout << "ENABLE" << "\n";
#endif IMPOSSIBLE
cout << "IMPOSSIBLE" << "\n";
}
사용법은 이처럼 if문이 나오면 반드시 endif가 나와야 하며 ENABLE이 참(=1)이라면 cout << "ENABLE" << "\n"; 의 코드를 삽입하고 IMPOSSIBLE이 참이라면 cout << "IMPOSSIBLE" << "\n";의 코드를 삽입하라는 뜻이다.
◎ #ifdef 및 #ifndef 지시문
정의 된 연산자와 함께 사용될 때 #if 지시어와 동일한 효과를 가진다.
#ifndef 식별자
#ifndef 식별자
이 지시문은 아래의 지시문과 같은 내용이다.
#if 정의된 식별자
#if! 정의된 식별자
#if는 매크로가 참인지 거짓인지에 따라서 동작한다면 #ifdef는 매크로가 '정의되어 있는지 아닌지'를 기준으로 동작한다.
#ifdef는 매크로가 정의되어 있다면이고
#ifndef는 매크로가 정의되어 있지 않다면이라는 의미이다.
◎ #error 지시문
전처리기가 해당 지시문을 발견하면 컴파일이 중지되고 여기에 포함된 오류 메시지가 전달된다.
#define _EXIT
#ifdef _EXIT
#error "Error exists."
#endif
전처리기가 해당 코드를 만나게 되면 error.c : error: #error "Error exists." 이렇게 출력되며 종료된다.
이 외에도 #import, #include, #line, #undef, #using 등이 전처리기 지시문에 포함된다.
참고 자료;
https://docs.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=vs-2019
'Study > C++ , C#' 카테고리의 다른 글
[C#] 닷넷 API (0) | 2021.12.22 |
---|---|
[C++] 클래스(Class)와 구조체(Struct)의 차이 (0) | 2020.01.15 |
[C++] QueryPerformanceCounter / 프로그램 실행 시간 측정 (0) | 2020.01.15 |
[C++] 매크로 함수와 인라인 함수(Inline) (0) | 2020.01.10 |
[C++] new 와 delete (0) | 2020.01.10 |