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를 사용하는 것이 좋다.
'Language > C' 카테고리의 다른 글
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - Makefile (1) | 2025.06.24 |
|---|---|
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 헤더 파일 분리와 다중 소스 파일 관리 (1) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 조건부 컴파일 (0) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 매크로 (0) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 선행처리기 (0) | 2025.06.24 |