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