분할 컴파일을 하다보면 사용자가 정의한 헤더 파일이 중복되는 경우가 발생할 수 있다. 헤더 파일의 중복은 헤더 파일 안에 정의한 것이 2번 중복 정의될 수 있으므로 반드시 막아야한다.

전처리 지시문

왜 헤더파일 안에 선언된 코드가 2번 중복되는가

아래 코드는 소스파일 한개와 헤더파일 2개로 구성되어있다.

main.cpp

#include <iostream>
#include "header1.h"
#include "header2.h"

using namespace std;

int main(void) {
	cout << func1() << endl;
	cout << func2() << endl;
	return 0;
}

header1.h

using namespace std;

string func1() {
	string s1 = "header1";
	return s1;
}

header2.h

#include "header1.h"

using namespace std;
string func2() {
	cout << "header1.h 가 필요행~ " << func1() << endl;
	string s2 = "header2";
	return s2;
}

위의 소스코드를 컴파일하면 에러 발생

Untitled

main.cpp는 header1.h와 header2.h가 동시에 필요하며, header2.h는 func1()를 사용하기 위해 header1.h가 필요하다. 관계를 그림으로 나타내면 아래와 같다.

Untitled

위 그림에서 보이는 것과 같이 헤더파일의 중복이 발생한다. 이때 중복되는 헤더 파일에 제일 앞에 #pragma once를 선언하게 되면 3번 중복의 발생을 피할 수 있다. #pragma once를 사용하게 되면 이미 인클루드한 사용자 헤더파일의 중복을 막을 수 있다. 👉🏻 #pragma once

“이 헤더 파일은 중복하지 마세요” 라는 뜻으로 이해하면 된다. 하지만 지원하지 않는 컴파일러가 있다는 것을 알아두자.

#pragma once 사용

#pragma once
using namespace std;

string func1() {
	string s1 = "header1";
	return s1;
}