인클루드 가드
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 2번째.
프로젝트에서 헤더 파일이 여러 번 포함되면, 컴파일러는 동일한 선언을 반복해서 보게 되어 오류가 발생합니다. 이는 여러 파일이 동일한 헤더를 포함하거나, 헤더들이 서로를 포함할 때 흔히 발생합니다. 인클루드 가드(Include guards)는 이 문제를 해결합니다.
인클루드 가드는 헤더의 내용이 오직 한 번만 처리되도록 보장하기 위해 세 개의 전처리기 지시문을 사용합니다:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
작동 방식은 다음과 같습니다: #ifndef MATH_UTILS_H는 MATH_UTILS_H 심볼이 아직 정의되지 **않았는지** 확인합니다. 정의되지 않았다면, 전처리기는 계속 진행하여 즉시 #define MATH_UTILS_H로 정의합니다. 이 지점과 #endif 사이의 모든 내용은 컴파일에 포함됩니다.
이 헤더가 두 번째로 포함될 때, MATH_UTILS_H가 이미 정의되어 있으므로 전체 블록을 건너뜁니다. 가드 이름은 일반적으로 파일 이름을 대문자로 표기하고 점과 특수 문자를 밑줄로 대체한 형태입니다.
작성하는 모든 헤더 파일에는 인클루드 가드(include guards)가 있어야 합니다. 이것은 컴파일 오류를 방지하고 프로젝트의 어디에서나 코드를 안전하게 포함할 수 있도록 하는 표준 관행입니다.
챌린지
쉬움인클루드 가드(include guards)를 추가하여 헤더 파일이 중복 포함되는 것을 방지해 봅시다. 이전 레슨의 인사말 유틸리티를 기반으로 하되, 이번에는 헤더를 여러 번 포함해도 안전하도록 만듭니다.
두 개의 파일을 생성하게 됩니다:
greet.h:greet함수 선언을 포함하는 헤더 파일입니다. 이번에는 전체 내용을GREET_H심볼을 사용하는 인클루드 가드로 감싸세요.main.c: 헤더를 포함하고,greet함수를 구현하며,main()에서 이를 호출하는 메인 파일입니다.
greet 함수는 이름을 위한 const char* 매개변수를 받아야 하며 다음을 출력해야 합니다:
Hello, Alice!헤더 파일은 다음과 같은 구조를 따라야 합니다:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endif하나의 입력으로 이름(문자열)을 받게 됩니다.
위의 형식에 표시된 대로 인사 메시지를 정확하게 출력하되, Alice를 제공된 이름으로 바꾸십시오.
치트 시트
인클루드 가드(Include guards)는 컴파일 중에 헤더 파일이 여러 번 처리되는 것을 방지하여 오류가 발생하는 것을 막아줍니다.
인클루드 가드는 세 가지 전처리기 지시문을 사용합니다:
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
// 헤더 내용이 여기에 들어갑니다
#endif
#ifndef는 심볼이 정의되지 **않았는지** 확인합니다. 정의되지 않은 경우, #define이 이를 정의하고 내용이 처리됩니다. 이후 다시 포함될 때는 심볼이 이미 정의되어 있으므로 전체 블록을 건너뜁니다.
가드 이름은 일반적으로 파일 이름을 대문자로 쓰고 점과 특수 문자를 밑줄(_)로 대체하여 만듭니다.
모든 헤더 파일은 표준 관행으로 인클루드 가드를 포함해야 합니다.
직접 해보기
#include <stdio.h>
#include "greet.h"
// TODO: "Hello, <name>!"을 출력하는 greet 함수를 구현하세요.
int main() {
char name[100];
scanf("%s", name);
// TODO: name을 사용하여 greet 함수를 호출하세요.
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.