C 언어의 헤더 파일이란?
C 언어의 헤더 파일(header file)에는 미리 정의된(predefined) 함수들이 담겨 있습니다. 대표적인 예로, 화면 출력과 입력을 담당하는 printf()와 scanf() 함수는 stdio.h 헤더 파일에 선언되어 있으며, 동적 메모리 할당에 쓰이는 malloc()이나 free() 같은 함수는 stdlib.h에 선언되어 있습니다.
각 헤더 파일은 서로 다른 미리 정의된 함수들을 포함하고 있어서, 프로그래머가 이를 활용하면 복잡한 기능도 간결하고 이해하기 쉬운 코드로 작성할 수 있습니다.
헤더 파일을 하나의 C 프로그램에서 두 번 포함(include)하더라도 오류가 발생하지 않습니다. 컴파일러가 두 번째 포함문을 자동으로 무시하기 때문입니다. 실제로 헤더 파일 앞에 붙는 #include 지시자는 컴파일 과정에서 해당 파일이 단 한 번만 포함되도록 보장하는 역할을 합니다.
예제 1
다음은 세 개 숫자의 평균을 구하는 C 프로그램입니다. stdio.h 헤더 파일이 두 번 포함되어 있지만, 컴파일러가 중복을 무시하므로 정상적으로 실행됩니다.
#include<stdio.h>
#include<stdio.h> //헤더 파일이 두 번 포함됨, 컴파일러가 무시
main(){
int a,b,c,d;
float avg;
printf("Enter values for a,b,c:");
scanf("%d%d%d",&a,&b,&c);
d=a+b+c;
avg=d/3;
printf("Average avg=%f",avg);
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter values for a,b,c:3 3 3 Average avg=3.000000
예제 2
이번에는 서로 다른 헤더 파일들이 각각 두 번씩 포함된 또 다른 C 프로그램입니다. 마찬가지로 모든 중복 포함이 무시되어 아무 문제 없이 컴파일됩니다.
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
//헤더 파일이 두 번 포함됨, 컴파일러가 무시
main(){
int a,b,c;
printf("Enter values for a,b:");
scanf("%d%d",&a,&b);
c=a+b;
printf("sum=%d",c);
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter values for a,b:2 4 sum=6
중복 포함 방지 원리: 인클루드 가드
컴파일러가 헤더 파일의 중복 포함을 처리할 수 있는 이유는 내부적으로 인클루드 가드(include guard) 메커니즘이 작동하기 때문입니다. 표준 헤더 파일들은 #ifndef, #define, #endif 전처리기 지시문으로 감싸져 있어서, 이미 한 번 포함된 파일이라면 매크로가 정의되어 있다는 조건 검사를 통해 두 번째 포함 시 내용이 완전히 건너뛰어집니다. 덕분에 개발자는 여러 소스 파일에서 같은 헤더 파일을 참조하더라도 함수 중복 선언 오류를 걱정할 필요가 없습니다.