포함 방지 장치
중복 포함을 방지해 보세요.
포함 방지 장치은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
헤더 중복 포함 문제
헤더는 다른 헤더를 포함하는 경우가 많습니다. 하나의 소스 파일에 같은 헤더가 두 번 포함되기 쉽습니다.
그러면 해당 헤더의 모든 선언이 두 번 나타납니다. struct나 typedef 같은 자료형 정의에서는 자료형을 두 번 이상 정의할 수 없으므로 컴파일 오류가 발생합니다.
중복 포함이 발생하는 과정
a.h와 b.h가 모두 types.h를 포함한다고 가정해 보겠습니다. 두 헤더를 포함하는 소스 파일에는 types.h가 두 번 삽입됩니다.
전처리기는 헤더 텍스트를 그대로 복사하므로 types.h의 정의가 중복되고, 재정의 오류가 발생합니다.
/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h" /* types.h now seen twice */헤더 보호
헤더 보호는 헤더를 여러 번 포함해도 안전하게 만드는 간단한 전처리기 기법입니다.
헤더 전체를 조건문으로 감싸 본문이 처음 한 번만 처리되게 합니다. 이후의 포함은 모두 건너뜁니다.
#ifndef TYPES_H
#define TYPES_H
/* header contents here */
#endif /* TYPES_H */헤더 보호의 작동 방식
헤더가 처음 나타났을 때 TYPES_H는 정의되어 있지 않으므로 #ifndef가 참이 되고 본문이 처리됩니다. 그런 다음 #define이 매크로를 설정합니다.
이후에 다시 포함되면 TYPES_H가 이미 존재하므로 #ifndef가 거짓이 되고 전처리기는 #endif까지 건너뜁니다.
#ifndef TYPES_H /* true only the first time */
#define TYPES_H /* remember we've been here */
/* ... body ... */
#endif완전한 헤더 보호 예시
여기에는 자료형 정의를 보호하는 실제적인 헤더가 나와 있습니다.
많은 파일이 point.h를 직접 또는 간접적으로 포함하더라도 Point 구조체는 번역 단위마다 정확히 한 번만 정의됩니다.
/* point.h */
#ifndef POINT_H
#define POINT_H
typedef struct {
int x;
int y;
} Point;
Point point_add(Point a, Point b);
#endif매크로 이름 정하기
헤더 보호 매크로는 프로젝트 전체에서 고유해야 합니다. 그렇지 않으면 두 헤더가 충돌하여 서로를 조용히 가릴 수 있습니다.
일반적으로 파일 이름에서 이름을 가져와 대문자로 작성합니다. point.h는 POINT_H가 되고, net/socket.h는 NET_SOCKET_H가 됩니다.
#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endif예약된 이름 피하기
대문자가 뒤따르는 밑줄로 시작하거나 이중 밑줄을 포함하는 식별자는 컴파일러와 표준 라이브러리를 위해 예약되어 있습니다.
__POINT_H__ 같은 보호 매크로는 피하세요. POINT_H처럼 끝에만 밑줄을 사용하는 형태가 안전하고 명확합니다.
#ifndef _POINT_H_ /* risky: reserved name pattern */
#ifndef POINT_H /* preferred */#pragma once 대안
대부분의 최신 컴파일러는 헤더 맨 위에 한 줄로 작성해 같은 역할을 하는 #pragma once를 지원합니다.
더 짧고 이름 충돌을 피할 수 있지만 C 표준의 일부는 아닙니다. 전통적인 #ifndef 보호는 어디서나 작동합니다.
/* point.h */
#pragma once
typedef struct { int x; int y; } Point;헤더 보호와 pragma 비교
#ifndef 보호는 완전히 이식 가능하고 표준에 포함되지만, 헤더마다 고유한 매크로가 필요합니다.
#pragma once는 간결하고 충돌이 없지만 컴파일러 지원에 의존합니다. 일부 프로젝트에서는 안전성을 극대화하기 위해 pragma와 전통적인 보호를 함께 사용합니다.
#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endif헤더 보호는 번역 단위별로 적용됩니다
헤더 보호는 하나의 소스 파일을 컴파일하는 동안 해당 파일 안에서 중복 포함되는 것을 막습니다.
서로 다른 .c 파일에서 헤더가 각각 한 번씩 처리되는 것은 막지 않습니다. 각 소스 파일은 서로 다른 번역 단위이므로 이는 정상입니다.
습관으로 만들기
작성하는 모든 헤더에 첫 줄부터 헤더 보호를 추가하세요. 세 줄만으로도 이해하기 어려운 여러 오류를 예방할 수 있습니다.
간단한 헤더도 나중에는 다른 헤더를 통해 간접적으로 포함될 수 있으므로 처음부터 보호하면 문제를 줄일 수 있습니다.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endif빠른 확인
헤더 보호를 얼마나 이해했는지 확인해 보세요.
복습
헤더를 두 번 포함하면 재정의 오류가 발생하는 이유와 헤더 보호로 이를 막는 방법을 배웠습니다.
고유한 매크로와 함께 #ifndef/#define/#endif를 사용하거나 #pragma once를 사용하세요. 다음에는 extern으로 파일 간에 변수를 공유하는 방법을 살펴보겠습니다.
자주 묻는 질문
“포함 방지 장치” 강의는 무료인가요?
네 — “포함 방지 장치” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“포함 방지 장치”에서 뭘 배우나요?
중복 포함을 방지해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“포함 방지 장치” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 헤더와 소스 파일
- 포함 방지 장치
- extern과 연결
- 여러 파일 컴파일하기