null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
헤더 중복 포함 방지 (Include Guard)
#c
#c-lang
#intermediate
#preprocessor
#include-guard
@devpc
|
2026-03-29 12:57:39
|
GET /api/v1/nodes/56?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# 헤더 중복 포함 방지 (Include Guard) ## 중복 포함 문제 헤더 파일이 여러 번 포함되면 타입이나 변수가 중복 선언되어 **컴파일 오류**가 발생합니다. ``` a.h → b.h 포함 main.c → a.h, b.h 둘 다 포함 → b.h가 두 번 처리됨 → 중복 선언 오류 ``` --- ## #ifndef / #define / #endif — 전통적인 방법 헤더 파일 전체를 조건부 컴파일로 감쌉니다. ```c // student.h #ifndef STUDENT_H // STUDENT_H가 정의되지 않았으면 #define STUDENT_H // 정의하고 내용 처리 typedef struct { char name[50]; int age; float gpa; } Student; void print_student(const Student *s); #endif // STUDENT_H ``` **동작 원리:** 1. 처음 포함 시: `STUDENT_H`가 없으므로 내용 처리 후 `STUDENT_H` 정의 2. 두 번째 포함 시: `STUDENT_H`가 이미 정의되어 있으므로 전체 스킵 --- ## 매크로 이름 규칙 충돌을 피하기 위해 **파일 경로 + 파일명**을 반영하는 이름을 사용합니다. ```c // 파일: include/utils/string_utils.h #ifndef INCLUDE_UTILS_STRING_UTILS_H #define INCLUDE_UTILS_STRING_UTILS_H // ... #endif ``` **일반적인 규칙:** 파일 경로를 대문자로 변환하고 `/`, `.`을 `_`로 치환합니다. --- ## #pragma once — 현대적인 방법 대부분의 현대 컴파일러(GCC, Clang, MSVC)에서 지원하는 간단한 방법입니다. ```c // student.h #pragma once typedef struct { char name[50]; int age; float gpa; } Student; void print_student(const Student *s); ``` | 구분 | `#ifndef` guard | `#pragma once` | |------|----------------|----------------| | 표준 | ✅ C 표준 | ❌ 비표준 (컴파일러 확장) | | 이식성 | ✅ 모든 컴파일러 | ✅ 거의 모든 현대 컴파일러 | | 편의성 | 3줄 필요 | 1줄로 끝 | | 오타 위험 | 매크로명 오타 가능 | 없음 | --- ## 완전한 헤더 파일 예시 ```c // math_utils.h #ifndef MATH_UTILS_H #define MATH_UTILS_H #include <stddef.h> // size_t // 상수 #define MATH_PI 3.14159265358979323846 // 함수 선언 double circle_area(double radius); double distance(double x1, double y1, double x2, double y2); int array_max(const int *arr, size_t n); #endif // MATH_UTILS_H ``` ```c // math_utils.c #include "math_utils.h" #include <math.h> double circle_area(double radius) { return MATH_PI * radius * radius; } double distance(double x1, double y1, double x2, double y2) { double dx = x2 - x1, dy = y2 - y1; return sqrt(dx*dx + dy*dy); } int array_max(const int *arr, size_t n) { int m = arr[0]; for (size_t i = 1; i < n; i++) { if (arr[i] > m) m = arr[i]; } return m; } ``` --- ## 헤더 파일에 포함할 것 vs 포함하지 말 것 | 포함 O | 포함 X | |--------|--------| | 타입 선언 (`typedef`, `struct`, `enum`) | 변수 정의 (`int count = 0;`) | | 함수 선언 (프로토타입) | 함수 정의 (본문) | | 매크로 (`#define`) | `static` 없는 전역 변수 정의 | | `inline` 함수 | `extern` 없이 전역 변수 선언 | | 다른 헤더 `#include` | 구현 세부 사항 | --- ## 정리 | 방법 | 코드 | |------|------| | `#ifndef` guard | `#ifndef HEADER_H` / `#define HEADER_H` / ... / `#endif` | | `#pragma once` | 파일 상단에 `#pragma once` 한 줄 | **핵심:** 모든 헤더 파일에 반드시 include guard 또는 `#pragma once`를 추가하세요. ---
// COMMENTS
ON THIS PAGE