Skip to content

Latest commit

 

History

History
71 lines (57 loc) · 4.19 KB

Preprocessor.md

File metadata and controls

71 lines (57 loc) · 4.19 KB

전처리기 (Preprocessor)

전처리기는 소스 파일의 텍스트를 조작하는 텍스트 처리기이다. 전처리기는 소스 파일을 구문 분석하지 않으나 토큰으로 구분하여 매크로 호출을 찾는다. 컴파일러는 일반적으로 첫 번째 단계에서 전처리기를 호출하지만 컴파일하지 않고 텍스트를 처리하기 위해 전처리기를 별도 호출할 수도 있다.

전처리기 지시문은 일번적으로 소스 프로그램을 쉽게 변경하고 여러 실행 환경에서 쉽게 컴파일하는데 사용된다. 각 지시문은 특정 작업을 수행하도록 전처리기에 지시한다. 전처리기는 텍스트에서 토큰을 대체하거나 다른 파일의 내용을 소스 파일에 삽입하거나 소스코드의 부분을 제거하여 컴파일되지 않도록 할 수 있다. 전처리기 코드 줄은 컴파일과정에서 매크로가 실제 코드로 대체되기 전 인식되고 수행된다. 따라서 매크로가 전처리 명령과 같이 보이는 항목으로 확장되면 전처리기에서 인식되지 않는다.

전처리기는 다음 지시문으로 분류된다.

  • 파일 처리를 위한 전처리문: #include
  • 형태 정의를 위한 전처리문: #define, #undef
  • 조건 처리를 위한 전처리문: #if, #ifdef, #ifndef, #else, #elif, #endif
  • 에러 처리를 위한 전처리문: #error
  • 디버깅을 위한 전처리문: #line
  • 컴파일 옵션 처리를 위한 전처리문: #pragram
지시문 설명
#define 식별자 또는 매개 변수화된 식별자와 토큰 문자열을 연결하는 매크로 만듬
#error 컴파일 시간에 사용자 지정 오류메시지를 내보낸 다음 컴파일을 종료
#import 형식 라이브러리의 정보를 통합하는데 사용
#undef #define으로 만든 이름을 제거 (정의 해제)
#if 소스 파일의 부분에 대한 컴파일을 제어한다. #if ????에 0이 오면 #if 다음 블럭을 컴파일하지 않음
#else #else#if와 함께 사용되는 것으로 #if지시어의 조건이 만족되지 않을 때 수행할 코드가 있는 경우 사용
#elif #if 와 함께 사용되며 #if 조건 외 다른 조건을 적용 시킬 때 사용
#endif 조건부 컴파일의 시작 지시문인 #if#ifdef과 쌍으로 조건 블록의 끝을 나타내기 위해 사용
#include 소스파일에 include 다음에 명시된 파일을 소스파일에 추가하기 위해 사용
#ifdef 식별자가 #define으로 정의되었는지 검증하고 다음 소스코드를 컴파일 할 때 사용
#ifndef ``#ifdef``` 에 의해서 확인된 조건의 반대인 경우를 확인하기 위해 사용
#pragma 컴파일러에게 직접 명령을 내릴 때 사용, 각각의 컴파일러마다 독립적인 기능을 제공하기 위해 사용
#line 프로그램 소스의 줄 번호와 파일 이름을 변경할 때 사용하며 지시문 바로 다음에 오는 줄의 값을 설정할 때 사용

다음 코드는 #define, #ifndef, else, endif를 사용한 프로그램 코드로 화면에 Normal에 출력된다. #define DEBUG 문은 DEBUG라는 식별자를 정의한 것이고 #ifndef DEBUG 문은 DEBUG라는 식별자가 정의되지 않는 경우를 확인하는 것으로 앞에서 DEBUG가 정의되어 있기 때문에 이 조건문의 결과는 false 가 되어 cout << str2 << endl; 가 실행되지 않는다. #else#ifndef #else #endif 구조의 else에 해당하는 것으로 DEBUG 라는 식별자가 정의된 경우를 조사하는 것으로 지금 코드에서 DEBUG 라는 식별자가 정의되어 있기 때문에 cout << str1 << endl; 가 실행된다.

#include <iostream>
using namespace std;

#define DEBUG

int main(int argc, char const *argv[])
{	
	string str1 = "Normal";
	string str2 = "Error";

	#ifndef DEBUG
	cout << str2 << endl;
	#else
	cout << str1 << endl;
	#endif
  
	return 0;
}

코드의 실행 결과는 다음과 같다.

Normal