devmae
개발자 향기
devmae
전체 방문자
오늘
어제
  • 전부 감상 (280)
    • Unity (52)
      • memo (37)
      • R&D (15)
    • 모바일 (32)
      • iOS (6)
      • Android (25)
    • 개발자 모드 (41)
      • 개발자처럼 파고들기 (28)
      • 한가해서 책읽는거 아님 (10)
      • 영상 요약 (3)
    • Languages (40)
      • C++ (23)
      • MFC (8)
      • Java (4)
      • javascript (5)
    • Flash (108)
      • tip (29)
      • tech (4)
      • as2.0 (1)
      • as3isolib (3)
      • flartoolkit (2)
      • 이미지 편집기 (2)
      • papervision3d (12)
      • scale form (2)
      • Flash Builder (12)
      • air (5)
      • as3.0 (20)
      • flash player (9)
      • 개념잡기 (6)
      • source (1)
    • +,-,×,÷ (3)
      • 수학 뽀개기 (3)

블로그 메뉴

  • 홈
  • 방명록

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
devmae

개발자 향기

Languages/C++

[펌]헤더파일 중복방지 #pragma once vs #ifndef~#endif

2012. 10. 4. 12:15

헤더파일 중복컴파일 방지를 위해 쓰이는 지시자에는 두 가지 종류가 있다.
바로 #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>

저작자표시 (새창열림)
    'Languages/C++' 카테고리의 다른 글
    • 일반화 템플릿과 특수화 템플릿
    • [펌]typedef으로 새로운 데이터형의 이름을 정의하는 방법
    • [펌]전처리기, 컴파일러, 어셈블러, 링커의 역할
    • [펌]Function
    devmae
    devmae
    enjoy with me?

    티스토리툴바