헤더파일 중복컴파일 방지를 위해 쓰이는 지시자에는 두 가지 종류가 있다.
바로 #pragma once 와 #ifndef~#endif 이다.
그렇다면 과연 이 두 개의 지시자의 차이는 무엇일까?
간단한 예제를 통해 알아보겠다.
1. #ifndef ~ #endif
First.h
#ifndef __First_h_
#define __First_h_
class First
{
......생략......
};
#endif
Second.h
#ifndef __Second_h_
#define __Second_h_
#include "First.h"
class Second
{
......생략......
};
#endif
Main.cpp
#include "First.h"
#include "Second.h"
void main()
{
......생략......
}
위와 같이 Second.h가 First.h를 include 하고 Main.cpp에서 First.h와 Second.h를 include한다고 가정하자.
#include의 작동 방식에 따라 #include "First.h"에 First.h의 소스가 그대로 복사된다.
Main을 컴파일 하면
//Main.cpp
/*First.h의 소스코드가 복사된다.*/
#ifndef __First_h_
#define __First_h_
class First
{
......생략......
};
#endif
/////////////////////////////////////////
/*Second.h의 소스코드가 복사된다.*/
#ifndef __Second_h_
#define __Second_h_
#include "First.h"
class Second
{
......생략......
};
#endif
/////////////////////////////////////////
void main()
{
......생략......
}
-->이 때 Second.h에 있는 #include "First.h"에 의해 First.h의 내용이 Second.h에 복사되어있는 상태이므로 First.h의 내용도 Main.cppdp 같이 복사된다.
컴파일 후 Main.cpp
//Main.cpp
#ifndef __First_h_
#define __First_h_
class First
{
......생략......
};
#endif
/*Second.h의 소스코드가 복사된다.*/
#ifndef __Second_h_
#define __Second_h_
#ifndef __First_h_
#define __First_h_
class First
{
......생략......
};
#endif
class Second
{
......생략......
};
#endif
void main()
{
......생략......
}
위와 같은 모양이 된다.
Main.cpp에는 First.h파일이 두번이나 들어있다.
바꿔 말하면, 컴파일러가 #include "First.h"가 보일 때 마다 First.h을 열어서 컴파일을 한다는 얘기이다.
즉, #include 한 횟수만큼 컴파일러가 First.h 파일을 열어서 봐야한다.
그렇다면 #pragma once는 어떤 식으로 작동할까
2. #pragma once
#pragma once는 헤더파일의 포함횟수에 관계없이 단 한번만 처리를 하고 같은 파일의 경우 파일을 읽기조차 하지 않는다.
#pragma once가 명시되면 컴파일러가 파일 열기자체를 시도하지 않는다는 것이다.
즉, #include가 몇번이 되던 단 한번만 컴파일 한다.
3. 장,단점 및 결론
#pragma once의 경우 컴파일 동안 오직 한번만 포함되도록 하므로 #pragma once가 명시되면 컴파일러가 파일 열기 자체를 시도하지 않으므로 컴파일 속도가 빨라진다.
그러나 #pragma once는 일부 구형컴파일러에서는 지원이 안되는 경우가 있기 때문에 안정성과 범용성에 있어서는
#ifndef ~ #endif를 쓰는 것이 좋다고 볼 수 있다.
결론은, 구형 컴파일러에서 동작하는 범용적인 소스를 작성해야 하는 경우라면 #ifndef ~ #endif의 사용하고,
그 외에는 #pragma once를 사용하는 것이 낫다.
참고사이트
http://neodreamer.tistory.com/310
http://awesome.thoth.kr/blog/9984530
<출처 : http://ace01kr.tistory.com/entry/%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC-%EC%A4%91%EB%B3%B5%EB%B0%A9%EC%A7%80-pragma-once-vs-ifndefendif>