Language/C

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

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

4. Include Guard (헤더 중복 포함 방지)

  • C 언어에서는 #include를 통해 헤더 파일을 여러 번 포함할 수 있다.
  • 하지만 같은 헤더 파일이 여러 번 포함되면 중복 정의 오류가 발생할 수 있다.
  • 이 문제는 매크로와 조건부 컴파일을 조합하여 해결할 수 있다.

✳️ 이를 위해 사용하는 기법이 바로 Include Guard(인클루드 가드)이다.


1) Include Guard의 구조

#ifndef HEADER_NAME    // ① 이 매크로가 정의되어 있지 않으면

#define HEADER_NAME    // ② 정의한다

 

// 실제 헤더 내용 작성

 

#endif                 // ③ 조건부 컴파일 종료

· 이 구조는 헤더 파일이 한 번만 컴파일되도록 보장한다.
· HEADER_NAME
대문자 + 언더스코어로 작성하는 것이 관례이다.
·
일반적으로 파일명을 기반으로 한 고유 식별자를 사용한다.

이 방식은 C 언어 표준에서도 널리 권장되는 전통적인 방법이다.


2) Include Guard vs. #pragma once

구분 Include Guard #pragma once
표준 여부 ANSI C 표준 비표준 (컴파일러 확장)
작성 방식 매크로 사용 한 줄 사용
이식성 매우 높음 일부 컴파일러 제한 있음
코드 길이 상대적으로 김 매우 짧음

💬 예시:

#pragma once

// 헤더 내용

⚠️ #pragma once는 편리하지만, 컴파일러에 따라 동작이 달라질 수 있다.
따라서 이식성이 중요한 경우에는 include guard 사용이 더 안전하다.


💻 예제 코드: Include Guard 적용

📁 my_header.h

#ifndef MY_HEADER_H     // 매크로가 정의되지 않았을 때만

#define MY_HEADER_H     // 매크로를 정의하고 아래 내용을 컴파일

// 헤더 파일의 실제 내용

void hello();

#endif  // MY_HEADER_H

 

📁 main.c

#include <stdio.h>

#include "my_header.h"

#include "my_header.h"   // 두 번 포함해도 문제가 발생하지 않음

void hello() {

    printf("Hello from header!\n");

}

int main() {

    hello();

    return 0;

}

🖨️ 실행 결과

Hello from header!

✳️ my_header.h가 두 번 포함되었지만, include guard 덕분에 컴파일 오류가 발생하지 않는다.


마무리 정리

1️ 헤더 파일을 여러 번 포함하면 중복 정의 오류가 발생할 수 있다.
2️
이를 방지하기 위한 전통적인 방법이 include guard이다.
3️
include guard #ifndef, #define, #endif로 구성된다.
4️
매크로 이름은 파일명을 기반으로 대문자 + 언더스코어 형태로 만든다.
5️
#pragma once는 간단하지만 비표준이므로, 호환성이 중요할 때는 include guard를 사용하는 것이 좋다.

반응형