Language/C

📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 선행처리기

e-cko 2025. 6. 24. 14:42
반응형
반응형

1. 선행처리기 (Preprocessor)

  • 선행처리기는 사용자가 작성한 C 소스 코드를 기계어로 번역하기 전에 먼저 수행되는 일련의 처리 과정이다.
  • 주된 역할은 코드의 간소화, 재사용성 향상, 이식성 개선 등이다.
  • 이식성이란 코드가 다른 시스템이나 환경에서 얼마나 쉽게 작동할 수 있는지를 의미한다.
  • 선행처리기는 이식성을 높이기 위한 도구로 사용된다.

⚠️ 선행처리기는 텍스트를 텍스트로 변환하는 반면, 컴파일러는 텍스트를 기계어로 변환한다.

1) 전처리 과정의 순서

전처리와 컴파일 전체 흐름은 다음과 같다:

1️ 소스 프로그램
 
선행처리기
2️
선행처리된 소스 프로그램
 
컴파일러
3️⃣ 목적 파일(.obj )
 
링커
4️
실행 파일(.exe )

2) 전처리 지시자의 특징

  • # 기호로 시작한다.
  • 끝에 ;(세미콜론)를 사용하지 않는다.
  • C 언어 문법의 영향을 받지 않는다.
  • ⚠️ 한 줄이 넘는 명령어는 줄 끝에 ‘\’를 붙여 줄바꿈을 이어서 사용해야 한다.

주요 전처리 명령어

전처리기 설명
#include 외부 파일 포함
#define, #undef 매크로 정의 및 해제
#if, #ifdef, #ifndef, #else, #elif, #endif 조건부 컴파일
#error, #line, #pragma 기타 컴파일 지시 정보 제공

3) #include 사용법

  • #include <파일명>
    ·
    시스템 헤더 파일을 포함할 때 사용한다.
    ·
    컴파일러가 지정한 표준 디렉토리에서 파일을 찾는다.
  • #include "파일명"
    ·
    사용자 정의 헤더 파일 포함 시 사용한다.
    ·
    현재 소스 파일이 위치한 디렉토리 또는 지정된 경로에서 먼저 찾는다.

예시:

#include <stdio.h>      // 표준 라이브러리 포함

#include "myheader.h"   // 사용자 정의 헤더 포함

  • 사용자가 정의한 헤더 파일이 다른 디렉토리에 위치할 경우에는 경로까지 작성해야 한다.
    예시:
    #include "..\headers\userstdio.h"

4) 헤더 파일 (Header File)

  • 헤더 파일은 매크로 상수, 함수 원형, 라이브러리 선언 등을 모아둔 파일이다.
  • 대부분 .h 확장자를 사용한다.

주요 표준 헤더 파일 종류:

헤더파일 설명
alloc.h 메모리 동적 할당 함수
conio.h 콘솔 입출력 함수
ctype.h 문자 검사 함수
direct.h 디렉토리 제어 함수
dos.h MS-DOS 제어 함수
errno.h 시스템 오류 코드 정의
io.h 저수준 파일 입출력
math.h 수학 함수 제공
process.h 프로세스 제어 함수
stdio.h 표준 및 파일 입출력
stdlib.h 수치 변환, 난수, 동적 할당
string.h 문자열 처리 함수

5) 사용자 정의 헤더 파일

  • 사용자가 직접 .h 파일을 만들어 정의할 수 있다.
  • #define 매크로, 함수 원형 선언, 상수 선언 등을 포함한다.
  • #pragma once해당 헤더 파일이 컴파일 과정에서 한 번만 포함되도록 보장한다.
  • 동일 헤더가 중복 포함되어 생기는 오류를 방지한다.

예시:

// mymath.h

#pragma once

 

#define PI 3.141592

int square(int x);

  • 사용자 정의 헤더가 다른 폴더에 있다면 #include "경로/파일명.h" 형태로 경로를 명시한다.

💻 예제 코드: 사용자 정의 헤더 활용 예제

📁 파일 구조

project/

├── main.c

├── mymath.h

└── mymath.c

 

🔹 mymath.h

// mymath.h

#pragma once    // 중복 포함 방지

#define PI 3.141592   // 매크로 상수 정의

int square(int x);    // 함수 원형 선언

 

🔹 mymath.c

// mymath.c

#include "mymath.h"   // 사용자 정의 헤더 포함

int square(int x) {

    return x * x;

}

 

🔹 main.c

// main.c

#include <stdio.h>      // 표준 입출력 포함

#include "mymath.h"     // 사용자 정의 헤더 포함

 

int main() {

    int num = 5;

 

    // 사용자 정의 함수 호출

    printf("정수 %d의 제곱은 %d입니다.\n", num, square(num));

    printf("원주율 PI %.6f입니다.\n", PI);

 

    return 0;

}

🔸 실행 결과

정수 5의 제곱은 25입니다.

원주율 PI 3.141592입니다.


 

마무리 정리

1️ 선행처리기는 컴파일 전 단계에서 텍스트 단위의 처리를 수행한다.
2️
#include, #define 등은 대표적인 전처리 명령어이다.
3️
#으로 시작하고, ; 없이 작성하며, C 문법과 독립적으로 동작한다.
4️
<파일명>은 표준 헤더 포함, "파일명"은 사용자 정의 헤더 포함에 사용한다.
5️
사용자 정의 헤더는 #pragma once로 중복 포함을 방지한다.
6️
헤더 파일에는 매크로, 함수 원형, 상수 등을 선언할 수 있다.

반응형