헤더 사용 예시
함수 선언 헤더
- C++는 함수 구현을 헤더에 해도 문제가 없다. 하지만 가급적 지양해야 한다.
헤더 파일에 함수 선언만 존재하는 경우
// 함수 선언 헤더 파일 add.h
#pragma once
int add(int num_a, int num_b);
// 함수 구현 파일 add.cpp
int add(int num_a, int num_b)
{
return num_a + num_b;
}
헤더 파일에 구현도 함께 존재할 수도 있다.
#pragma once
int add(int num_a, int num_b)
{
int sum = num_a + num_b;
return sum;
}
함수 호출
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
cout << add(1, 2) << endl;
return 0;
}
<>, ""의 차이
- <> : <iostream>과 같이 표준에 포함된 라이브러리의 경우 <>로 감싸고 .h를 붙이지 않는다.
- "" : "add.h"와 같이 사용자가 직접 정의한 헤더를 사용할때 사용한다.
헤더 파일 경로
헤더 파일이 프로젝트 내의 다른 디렉토리에 존재할때는 상대 경로를 적어준다.
#include <iostream>
#include "MyHeaders/add.h"
헤더 가드
아래와 같은 코드를 분리한다고 해보자
// Source.cpp
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
void doSomething()
{
add(1, 2);
}
int main()
{
doSomething();
return 0;
}
add 함수를 분리하기 위해 add.h를 추가했다. 단, 헤더파일 앞에 위치한 #pragma once라고 되어있는 부분을 제외한다.
//#pragma once
int add(int a, int b)
{
return a + b;
}
doSomething 함수도 분리하기 위해 헤더파일을 만들어서 추가한다. 마찬가지로 여기서도 #pragma once를 지운다.
//#pragma once
#include "add.h"
void doSomething()
{
add(1, 2);
}
그리고 main 함수에서 doSomething을 사용하기 위해 헤더를 include 하였다.
// Source.cpp
#include <iostream>
#include "my_work.h"
using namespace std;
int main()
{
doSomething();
return 0;
}
빌드를 수행하면 별 문제 없이 정상적으로 된다.

그런데 만약 add.h 헤더를 별도로 main 함수에서 아래와 같이 include해야할 경우가 발생하면 어떨까?
#include <iostream>
#include "my_work.h"
#include "add.h"
using namespace std;
int main()
{
doSomething();
return 0;
}
위 코드를 빌드하면 에러가 발생한다.

왜 이런 오류가 발생하는것일까? 함수의 정의를 중복해서 포함시켰기 때문이다. add 함수의 body는 add.h에 정의되어있다. 그런데 add.h를 doSomething.h와 source.cpp 두 곳에서 중복으로 #include시켰기 때문에 함수가 중복으로 정의되어 오류가 발생하는 것이다. 이러한 경우를 방지하기 위해 헤더가드를 추가해야 하는 것이고 #pragma once가 헤더가드의 역할을 수행하는 것이다.
주석처리했던 #pragma once를 복구하고 빌드를 수행하면 정상적으로 빌드가 수행된다.
add.h
#pragma once // 헤더가드를 포함시킴
int add(int a, int b)
{
return a + b;
}
my_work.h
#pragma once // 헤더 가드 포함
#include "add.h"
void doSomething()
{
add(1, 2);
}
정상적으로 빌드 수행 완료

'C++ 학습' 카테고리의 다른 글
| [C++] 캐스팅 (0) | 2023.09.28 |
|---|---|
| [C++] 네임스페이스 (0) | 2023.09.26 |
| [C++] 함수 (0) | 2023.09.25 |
| [C++] 변수 (0) | 2023.09.24 |
| [C++] 기본 프로그램 구조 (0) | 2023.09.24 |