C언어 전처리기와 매크로


C언어 전처리기와 매크로
C언어 전처리기 종류와 사용 예제에 대해서 설명드립니다. 전처리 기능을 이용하여 C언어 매크로 함수 등을 만들 수 있는데 매크로 상수 또는 매크로 함수 등에 대해서도 함께 설명드리도록 하겠습니다.

C언어 전처리기와 매크로

전처리기 기능

C언어를 이용하여 개발 할 때 주로 소스코드를 확장자가 c라는 텍스트 파일로 만들게 됩니다. 그리고 이러한 텍스트파일은 컴파일러를 통해서 컴파일 된 후에 실행 파일이 생성 되게 됩니다.

소스코드를 오브젝트 파일로 컴파일 하는 과정 중에 소스코드를 전처리(preprocessing)하는 과정은 전처리기(preprocessor)에 의해서 처리됩니다. 이 글에서는 전처리기에서 사용되는 문법등에서 대하여 설명드립니다.

C언어 전처리기와 매크로

#include

C언어를 이용하여 가장 많이 사용하는 전처리기 지시어가 #include 일 것입니다. 이 지시어는 가리키는 파일을 가져와서 컴파일 시점에 해당 소스코드와 함께 컴파일 하게 됩니다.

‘<’, ‘>’ 라는 구문은 표준 헤더파일을 가지고 오는 것이고 ‘”’, ‘”’ 으로 묶여 있는 파일은 사용자 정의 헤더 파일을 가지고 와서 컴파일 하게 됩니다.

/*
 * sum.h
 */
int sum(int a, int b) {
  return a+b;
}
#include <stdio.h>
#include "sum.h"

int main(void) {
  int a = 10;
  int b = 20;

  printf("%d + %d = %d\n", a, b, sum(a, b));  
  
  return 0;
}  

위의 소스코드를 보면 #include “sum.h” 라는 내용이 있습니다.

이 내용은 소스코드를 컴파일하기 전, 전처리기(preprocessor)에 의해서 sum.h 의 내용을 해당 위치에 첨부 하여 하나의 파일처럼 컴파일 하라는 의미입니다.

결과적으로 소스코드를 컴파일 하게 될 때 아래와 같은 소스코드가 되어 컴파일 되게 됩니다.

/*
 * sum.h
 */
int sum(int a, int b) {
  return a+b;
}
#include <stdio.h>
int sum(int a, int b) {
  return a+b;
}

int main(void) {
  int a = 10;
  int b = 20;

  printf("%d + %d = %d\n", a, b, sum(a, b));  
  
  return 0;
}

#define

define 전처리기는 특정한 내용을 다른 내용으로 치환하고자 할 때 사용하는 전처리기입니다.

예를 들어 아래와 같은 내용의 #define 전처리기가 있다고 가정하여 설명드리겠습니다.

#define PI 3.1415

위의 내용은 PI 라는 문자를 3.1415 값으로 치환한다는 의미입니다. 실제 소스코드가 오브젝트파일로 컴파일 되기 전에 위의 코드가 치환되어 컴파일 되게 됩니다.

이때 PI 라는 문자는 매크로(macro) 라고 불리며 3.1415는 매크로 상수라고 한합니다.

#define 구문으로 함수를 작성하여 사용할 수 도 있는데 이를 매크로 함수라고 부릅니다.

그리고 C언어에는 정의하지 않아도 프로그램 개발에 도움을 주는 미리 정의되어 있는 매크로가 있습니다. 아래의 내용은 ANSI C에서 미리 정의된 매크로를 보여줍니다.

  • __FILE__ 소스코드 파일 이름
  • __LINE__ 현재 소스코드 라인 번호
  • __DATE__ 소스코드가 컴파일 된 날짜
  • __TIME__ 소스코드가 컴파일 된 시각
  • __TIMESTAMP__ 소스코드가 컴파일 된 타임스탬프

#if(#ifdef) ~ [#elseif] ~ [#else] ~ #endif

소스 코드를 조건부 컴파일 할 수 있는 전처리기입니다. 특정 조건을 기준으로 특정한 위치의 소스코드를 컴파일 하거나 컴파일 하지 않을 수 있습니다.

#include <stdio.h>
#define VERSION 1

int main(void) {
#ifdef VERSION
  #if VERSION > 2
    printf("현재 버전이 2 보다 높습니다.\n");
  #else
    printf("현재 버전은 %d 입니다.\n", VERSION);
  #endif
#else
    printf("버전이 정의되지 않았습니다.\n");
#endif  
  
  return 0;
}

위의 소스코드를 컴파일 하여 실행한 결과는 아래와 같습니다.

현재 버전은 1 입니다.

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)