본문 바로가기
프로그래밍/C

C ] 전처리기 (Preprocessor)

by eteo 2022. 8. 24.

전처리기(preprocessor)는 프로그램을 컴파일할 때 컴파일 직전에 실행되는 것으로, 전처리기가 실행되면 각 코드 파일에서 #으로 시작하는 지시자(directives)를 찾는다.

 

 

 

#include

지정된 파일을 그 위치에 복사, 파일을 포함시키기 위해 사용한다. Current directory 에서 먼저 찾고 그 다음 표준 라이브러리에서 찾음

 
// 표준 라이브러리
#include <filename>

// 사용자가 정의한 파일
#include "filename"

 

 

 

 

#define

 심볼릭 상수나 매크로를 생성할 때 사용. 컴파일 시 텍스트로 대체됨. 매크로 사용의 장점은 코딩 오버헤드를 줄여줌.

 

#define PI 3.141592

 

#define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) )

#define RECTANGLE_AREA( x, y )  ( ( x ) * ( y ) ) 
rectArea = RECTANGLE_AREA( a + 4, b + 7 );

 

 

 

 

 

 

#undef

 심볼릭 상수나 매크로를 생성한 것을 해제할 때 사용

 

 

 

 

 

 

 

조건부 컴파일

#if !defined( NULL )
	#define NULL 0
#endif

 

모든 #if 는 #endif로 끝남

 

#ifdef 는 #if defined 의 줄임 표현

#ifndef 는 #if !defined 의 줄임 표현

 

#elif 와 #else 사용 예시

#if defined(STM32F4XX)
    // do something …
#elif defined(ESP32)
    // do something …
#else
    // do something …
#endif

 

 

 

컴파일 할 때 제외하고 싶은 코드가 있을 때 아래와 같이 사용

#if 0
    code commented out
#endif
 
 
 
디버깅 할 때 사용 예시
#define DEBUG 1

#if (DEBUG==1)
	printf (“ Variable x = %d \n”, x) ;
#endif 

#define DEBUG

#if defined(DEBUG)
	printf (“ Variable x = %d \n”, x) ;
#endif

 

 

 

 

 

assert 매크로

#include <assert.h>		// assert가 정의된 헤더 파일 포함

assert(src != NULL);	// src가 NULL이면 프로그램 중단
assert(num > 0);		// num이 양의 정수가 아니면 프로그램 중단

 

 

만약 NDEBUG 가 #define 되어 있다면 모든 assert 매크로가 무시된다.

#define NDEBUG