블로그 이미지
Starrysky1101

Tag

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
  • total
  • today
  • yesterday
2010. 3. 28. 07:13 Programming/C++
#pragma once 를 쓰는 이유에 대해 포스팅했었다.
간단하게 이유를 설명하자면 여러개의 헤더파일과 cpp파일이 있을때
컴파일시 h파일을 중복되서 컴파일함을 없애주기 위해서이다.

http://second815.tistory.com/3  #pragma once 를 쓰는 이유

그러나 #pragma once는 표준이 아니다!

http://ptah.tistory.com/16
에서 다음과 같은 내용을 퍼왔다. 아래에 카피해두었다.

http://neodreamer.tistory.com/310
확실히 개념이 서질 않는다면 이 링크의 글을 읽어본다. 가장 명확한듯하다.


그전에  #ifdef, #ifndef, #endif 에 대해 알고싶다면
http://second815.tistory.com/5 를 읽어본다.



http://neodreamer.tistory.com/310 의 내용

보통 Visual Studio 계통의 소스에서는 #progma once를 자주 보게 됩니다.
그러나 GCC 계통의 소스에서는 보기가 힘들죠. (전 아직 뵌적이 없습니다.)

결론부터 말하자면 저라면 #ifndef 를 사용하겠습니다.
아직 #progma once는 표준이 아니기 때문이죠.
C99는 다음과 같은 표준을 가지고 있다고 합니다.

#pragma STDC FP_CONTRACT on-off
#pragma STDC FENV_ACCESS on-off
#pragma STDC CX_LIMITED_RANGE on-off

on-off := ON | OFF | DEFAULT

추가적으로 VS에서는 #progma가 컴파일 속도가 더 빠르다고 합니다.
#progma once를 만나자마자 건너뛰어서라는데 얼마나 빠를지는...

따라서 저의 경우 헤더에 다음과 같이 적습니다.

#progma once
#ifndef __ANY_THING__
#define __ANY_THING__
...
#endif






http://neodreamer.tistory.com/310의 내용

C++ 프로그래밍에서 헤더의 중복 #include 를 방지하는 방법으로 #pragma once 와 #ifndef 를 활용하는 방법이 있다. 이 두 방법은 모든 컴파일러에서 동작하는 것은 아니다.

우선 사용법을 보면 #pragma once 의 경우 헤더의 상단에 한번 적용 하면 된다.


그리고 #ifndef 를 활용하는 방법은 아래 처럼 define 이 되지 않았을 경우 지정된 값을 지정하여 이후에 다시 불러 들이는 것을 방지한다.


위 두 가지 방법은 여러가지 면에서 차이가 있다.

우선 첫 번째의 경우인 #pragma once 의 경우 컴파일러 지시자로 이를 한번 인식한 후 다음부터 같은 파일의 경우 파일을 읽기조차 하지 않는다. 그래서 컴파일 단계의 파일 해석 단계는 두 번째 방법보다 빠르다. 하지만 컴파일러 지시자로 특정 컴파일러에서만 동작을 한다. 이 지시자는 Visual C++ 5.0 이상에서만 동작을 한다.

두 번째의 경우 모든 컴파일러에서 동작을 하지만 헤더 파일을 여러번 include 를 할 경우 매번 헤더 파일을 열어서 define 여부를 확인해야 하기 때문에 컴파일 과정인 파일 해석 단계에서 첫 번째 방법보다 다소 느리다.

두 가지 방법은 속도와 호환성 문제가 얽혀 있는데 무지 큰 프로젝트가 아닐 경우 속도에서는 크게 차이가 나지 않을 것 같고 Visual C++ 에서만 작업하는 것이 아니라면 호환성을 고려하여 두번째 방법을 사용하는 것이 좋아 보인다.


posted by Starrysky1101