016. PREPROCESSORS

Posted on by pkchan

코드는 컴파일 하기 전에 전처리 과정을 거칩니다. #include문에 지정된 라이브러리 파일 혹은 헤더 파일을 포함하는 등의 과정을 거쳐 코드를 완성한 후에 컴파일을 실행합니다.

전처리문은 항상 #과 함께 시작합니다.
파일 처리를 위한 전처리문 : #include
형태 정의를 위한 전처리문 : #define, #undef
조건 처리를 위한 전처리문 : #if, #ifdef, #ifndef, #else, #elif, #endif
에러 처리를 위한 전처리문 : #error
디버깅을 위한 전처리문 : #line
컴파일 옵션 처리를 위한 전처리문 : #pragma

016-01 // #INCLUDE

#include는 헤더 파일 등의 외부 파일을 읽어서 코드에 포함하는 역할을 합니다. 바이너리 파일이 아닌 코드 소스를 말합니다.

#include <stdio.h>
#include "header.h"

<...>,”…” 의 차이는 <...>의 경우 컴파일러가 정한 표준 디렉터리를 기준으로 찾기 때문에 표준 함수가 저장된 헤더 파일을 포함할 경우 많이 사용하고, “…”의 경우 .c파일이 저장된 위치를 기준으로 찾기 때문에 사용자가 만든 헤더 파일을 포함할 때 자주 사용합니다.

#include “c:\mydir\header.h”
#include “..\header.h”

절대경로 상대경로 모두 사용이 가능합니다.

016-02 // #DEFINE, #UNDEF

상수값을 지정하기 위한 예약어로 매크로라고 부릅니다. 특정 구문에 상수를 지정하고 전처리 과정에서 해당 구문을 상수로 모두 치환합니다.

#define MAX 50
#define SUM(x) ((x) = (x) + (x))
#define NAME "jane"

MAX를 사용해 전처리 과정에서 상수로 치환할 수 있으며, 마치 함수처럼 사용도 가능합니다. SUM(3)은 전처리 과정에서 6으로 치환됩니다. 문자열도 사용할 수 있으며, 코드 중간에 치환을 중지하고 싶다면 #undef 명령을 해주면 매크로 정의를 무효화하고 치환을 중지합니다.

#undef MAX
#undef SUM(x)
#undef NAME

#define 등의 전처리 지시자는 끝에 세미콜론을 붙이지 않습니다. 문장이 길어져 줄바꿈을 해야한다면 끝에 /(역슬래쉬)를 써야합니다. #는 첫 시작에도 사용하지만 연산 문구에 인자로도 사용이 가능합니다.

#include <stdio.h>

#define message_for(a, b) \
          printf(#a " and " #b ": We love you!\n")

int main(void) {

          message_for(Carole, Debra);

          return 0;

} // Carole and Debra: We love you!

##을 사용하면 두 인자를 붙여서 출력할 수 있습니다.

#include <stdio.h>

#define tokenpaster(n) \
          printf ("token" #n " = %d", token##n)

int main(void) {

          int token34 = 40;
          tokenpaster(34);

          return 0;

} // token34 = 40

016-03 // #IF, #IFDEF, #IFNDEF, #ELSE, #ELIF, #ENDIF

#if, #ifdef, #ifndef는 선언된 매크로를 기준으로 컴파일할 블럭을 지정할 수 있습니다.

#ifdef _DEBUG

          code...

#endif

#ifdef는 _DEBUG 매크로가 정의되어 있으면 코드를 실행합니다.

#ifndef _DEBUG

          code...

#endif

#ifndef는 _DEBUG 매크로가 정의되어 있지 않으면 코드를 실행합니다.
#ifdef, #ifndef모두 하나의 매크로만 지정할 수 있습니다. 2개 이상의 매크로를 검사하고 싶다면, #if를 써야합니다.

#if MAX || MIN
#if defiend(MAX) || defined(MIN)
#ifndef _header__
#define _header__

#include <stdio.h>
#include "header.h"

#endif

// 해더 파일이 2번 포함 되는 것을 방지합니다.

016-04 // PREDEFINED MACRO

C언어에서 미리 지정되어있는 매크로입니다. 따로 정의 하지 않고 사용할 수 있는 매크로입니다.

macro meaning of macro
__FILE__ 컴파일된 파일의 경로와 파일명을 출력합니다.
__LINE__ 현재 행 번호를 정수형 데이터로 출력합니다.
__DATE__ 컴파일된 날짜를 문자열로 출력합니다.
__TIME__ 컴파일된 시간를 문자열로 출력합니다.
__STDC__ 컴파일러가 ANSI C표준이면 1아니면 0
#include <stdio.h>

int main() {
                    
          printf("File :%s\n", __FILE__ );
          printf("Date :%s\n", __DATE__ );
          printf("Time :%s\n", __TIME__ );
          printf("Line :%d\n", __LINE__ );
          printf("ANSI :%d\n", __STDC__ );
                    
}

016-05 // #PRAGMA

#pragma는 컴파일러에게 명령할 수 있는 기능입니다. 컴파일러가 지원해주는 명령을 사용할 수 있습니다. 해당 컴파일러에서 처리할 수 없는 명령은 그냥 무시됩니다.

#pragma once
해당 해더 파일이 한번만 포함될수 있도록 컴파일러에 지시합니다.

#pragma comment(lib, “*.lib”)
특정 라이브러리를 링크할때 많이 사용됩니다.

#pragma warning(disable:4176)
해당 번호에 포함되는 경고는 무시합니다.

이외에도 여러 명령이 있습니다.

Leave a Reply