헤더 가드
함수를 두 번 이상 정의하는 프로그램은 컴파일 에러가 발생한다
#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++ 언어의 공식적인 부분이 아니므로 모든 컴파일러가 지원하는 것은 아니다. 호환성을 위해 헤더 가드를 사용하는 것이 좋다.