c++

헤더 가드

풀스택 개발자 2020. 1. 13. 18:29

함수를 두 번 이상 정의하는 프로그램은 컴파일 에러가 발생한다

#include<iostream>
using namespace std;

void doSomething()
{
	add(1, 2);
}
int add(int a, int b)
{
	return a + b;
}
int main()
{
	doSomething();

	return 0;
}

                                                              <main.cpp>

다음과 같은 소스 파일이 있다.

이때 add함수와 doSomething 함수를 헤더파일로 만들어서 include해서 사용하겠다.

 

int add(int a, int b)
{
	return a + b;
}

                                                                    <add.h>

 

#include "add.h";
void doSomething()
{
	add(1, 2);
}

                                                              <doSomething.h>

 

#include<iostream>
#include "new.h";
#include "add.h";
using namespace std;


int main()
{
	doSomething();

	return 0;
}

                                                                <main.cpp>

 

이렇게 헤더파일과 main소스파일을 구성하면 컴파일 에러가 난다 그 이유가 뭘까?

main.cpp의 include를 풀어해석하면

#include<iostream>
//#include "new.h";
//#include "add.h";
using namespace std;


int add(int a, int b)
{
	return a + b;
}

int add(int a, int b)
{
	return a + b;
}
void doSomething()
{
	add(1, 2);
}
int main()
{
	doSomething();

	return 0;
}

다음과 같다 즉add함수가 두번 정의되어서 컴파일 에러가 발생한다 

이런 현상을 어떻게 하면 방지할수있을까? 

 

방법은 두가지 이다

 

//#pragma once

#ifndef doSomething//doSomething가 이미 정의되어있으면
#define doSomething
int add(int a, int b)//이 내용을 정의하지말라
{
	return a + b;
}
#endif // !doSomething

                                                                   <add.h>

다음과 같이 ifndef endif를 사용하는것이다

doSomething이 다른데서 이미 정의를 하였으면 본 내용을 정의하지 않는 방법이며 이것이 헤더 가드 방법이다.

 

#pragma once

int add(int a, int b)
{
	return a + b;
}

                                                                   <add.h>

 

이 방법은 헤더 파일을 만들면 저절로 #pragma once가 생성되있다

이 또한 add가 다른곳에서 정의되었으면 본 내용을 또 정의하지 않는 방법이며 헤더 가드 방법보단 수월한 방법이다

 

이때 add.h파일만 #pragma once를 선언하는게 아니고 <doSomething.h>에도 선언해준다.

 

#pragma once는 헤더 가드와 같은 기능을 하며, 짧다는 게 장점이다.

그러나 C++ 언어의 공식적인 부분이 아니므로 모든 컴파일러가 지원하는 것은 아니다. 호환성을 위해 헤더 가드를 사용하는 것이 좋다.