📚선행처리기란?

선행처리기는 컴파일에 앞서 프로그램 선두에 선언된 지시자들을 미치 처리하는 역할을 한다. 소스 프로그램을 컴파일러에게 전달하기 전 사용자가 정의한 여러 내용들을 먼저 처리한다.


선행처리기 기능
#include 파일 포함
#define 매크로 정의
#if, #else, #elif, #endif 조건부 컴파일


선행처리기 사용시 주의사항

  • 반드시 #으로 시작해야 한다.
  • 명령문 끝에는 세미콜론을 붙이지 않는다.
  • 한 줄에 하나의 명령만 쓴다.
  • 소스 프로그램의 첫 부분에 위치해야 한다.



📚파일 포함

#include 지시어는 C 언어에서 제공되는 헤더 파일을 소스 파일에 읽어 들여 함께 컴파일 할 때 사용된다. C 언어에서 prinf(), 나 scanf()를 사용하기 위해서는 이 함수들의 원형(prototype)이 선언되어 있는 표준 입출력 헤더 파일인 stdio.h를 소스 파일에 포함시켜야 한다.


#include 뒤에 < >는 보통 표준 헤더 파일(시스템 헤더 파일)을 포함시킬 때 사용하고 “ “는 사용자가 따로 헤더 파일을 작성했을 경우 사용한다.

1
2
#include <stdio.h>
#include "my.h"


표준 헤더 파일은 컴파일러의 종류와 버전에 따라 조금씩 다르다. 대부분의 컴파일러가 제공하는 헤더 파일의 일부를 알아보면 아래와 같다.

  • ctype.h: 문자 검사
  • math.h: 수학 함수
  • stdlib.h: 문자열 반환, 기억공간 할당
  • stdio.h: 표준 입출력
  • string.h: 문자열 관련
  • time.h: 시간 관련



📚매크로 정의

매크로는 #define 지시어를 사용하여 단순 치환되는 자료이다. 자주 사용되는 명령이나 상수값 등을 대표하는 이름을 붙여 사용하는 대상이 매크로이다.

매크로 사용 시 주의사항

  • 매크로는 일반적으로 대문자를 사용한다.
  • 매크로 정의문 끝에는 세미콜론을 사용하지 않는다.
  • 문자열이 한 줄을 넘어설 때는 \를 사용한다.
  • 매크로 정의를 해제할 때 매크로명만 기입한다. #undef 사용


📄매크로 상수 정의

1
2
3
4
#include <stdio.h>
#define PI 3.141592
#define TEL "111-1234"
#undef PI



📄매크로 함수 정의

매크로 함수의 장점

  • 단순 치환 방식이므로 전달 인자의 자료형을 명시할 필요가 없고 어떠한 자료형 변수를 인자로 전달해도 잘 동작한다.
  • 단순 치환 방식이므로 한두 줄의 코드의 경우 함수로 정의하는 것보다 속도가 빠르다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#define ADD(x,y) x + y
#define MULTIPLE(x,y) x * y

void main()
{
  int a, b;

  a = ADD(1, 2);
  b = MULTIPLE(2, 3);

  printf("%d \n", a);
  printf("%d \n", b);
}




📚조건부 컴파일

조건부 컴파일은 조건에 따라 프로그램을 컴파일하는 명령이다. #if, #elif, #else, #endif 지시자가 사용된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#define CONDITION 3

void main()
{
  #if CONDITION > 3     // #if 조건문
    printf("a");        // 명령문

  #elif CONDITION > 0  // #elif 조건문
    printf("b");       // 명령문

  #else
    prinf("c");
  #endif
}


#elif와 #else는 필요 없을 경우 생략이 가능하다. #if는 주어진 조건이 참이면 바로 아래 블록을 컴파일러에게 넘기고 그렇지 않으면 삭제한다.

#if와 #elif 뒤에는 조건문이 오는데 이것은 선행 처리 과정에서 진위 여부를 판단할 수 있어야 한다. 쉽게 말해, 변수를 지정하거나 함수를 호출할 수 없다. 주로 매크로값이 지정된다.

Leave a comment