헤더파일
헤더파일을 include 하는 방식에는 2가지 방법이 있다.
첫 번째는 <>를 사용하는 방식이고 두 번째는 ""를 사용하는 방식이다.
첫 번째 방식을 사용하면 표준 헤더파일이 저장되어 있는 디렉터리 안에서 파일을 찾게 된다.
따라서 이 방식은 #include <stdio.h>와 같이 표준 헤더파일을 include 할 때 사용된다.
두 번째 방식을 사용하면 기본적으로는 소스파일이 저장된 디렉터리 안에서 헤더파일을 찾는다.
이때 헤더파일의 이름과 함께 절대경로를 명시하여 include 하면 헤더 파일이 어디 있던 사용이 가능해진다.
따라서 두 번째 방식은 사용자가 정의한 헤더파일을 포함시킬 때 사용된다.
헤더파일은 마치 매크로와 같은 역할을 한다.
해당 부분을 헤더파일이 완벽히 대체하게 되는 것이다.
따라서 아래와 같은 코드작성이 가능하다.
header1.h
int main()
{
int num = 5;
header2.h
printf("%d", num);
return 0;
}
FileName.c
#include <stdio.h>
#include "header1.h"
#include "header2.h"
따라서 FileName.c 는 아래 코드와 완전히 같다고 할 수 있다.
#include <stdio.h>
int main ()
{
int num = 5;
printf("%d", num);
return 0;
}
헤더파일은 주로 외부에 선언된 변수나 함수에 접근하기 위한 선언을 할 때 사용된다.
extern 선언을 필요할 때마다 매번 작성하는 것은 번거롭기 때문에 이것들을 헤더파일로 묶어서 사용하는 것이다.
또한 구조체를 선언할 때에도 헤더파일을 사용하면 편리하다.
구조체를 사용할 때에는 구조체를 사용하려는 모든 소스파일에 선언이 필요하기 때문이다.
헤더파일 중복삽입
헤더파일을 선언하다보면 헤더파일의 중첩이 발생할 수도 있다.
header1.h
int square(int a) {
return a * a;
}
header2.h
#include "header1.h"
float CircleArea(int r) {
return square(r) * 3.14;
}
header3.h
#include "header1.h"
float TriangleArea(int a) {
return square(a) / 2;
}
test.c
#include <stdio.h>
#include "header2.h"
#include "header3.h"
int main()
{
printf("반지름이 5인 원의 넓이 : %f\n", CircleArea(5));
printf("한 변의 길이가 5인 정삼각형의 넓이 : %f\n", TriangleArea(5));
return 0;
}
위 코드에서 header2.h 와 header3.h 에서 모두 header1.h를 포함하고 있다.
따라서 header2.h와 header3.h를 모두 include 하는 test.c는 header1.h를 두 번 포함하는 꼴이 된다.
이것을 해결하기 위해 조건부 컴파일 매크로를 사용할 수 있다.
특정한 매크로를 선언하여 해당 매크로가 선언되어있지 않을 때만 코드를 실행하는 것이다.
#ifndef __HEADER1_H__
#define __HEADER1_H__
int square(int a) {
return a * a;
}
#endif
위 코드처럼 작성한다면 test.c에서 header2.h를 include 한 순간 __HEADER1_H__도 정의된다.
그렇게 되면 header3.h를 include 하더라도 __HEADER1_H__가 이미 정의되어있기때문에 header1.h의 내용은 컴파일되지 않는다.
'C언어 > C언어 문법' 카테고리의 다른 글
[C언어] 포인터 선언과 메모리 관리 (0) | 2024.09.19 |
---|---|
[C언어] 열거형 (enum) (0) | 2024.03.10 |
[C언어] 파일의 분할 (extern, static) (0) | 2024.02.28 |
[C언어] 파일 입출력, 파일 스트림 생성 (fopen, fclose) (0) | 2024.02.28 |
[C언어] 조건부 컴파일 매크로 (#if, #elif, #endif, #ifdef, #ifndef) (0) | 2024.02.25 |