showTitle("https://tistory1.daumcdn.net/tistory/520789/skin/images/", "viewTitle.swf", 600, 30, "Header에서 #pragma once Vs #ifndef", "/entry/Header%EC%97%90%EC%84%9C-pragma-once-Vs-ifndef", "left", "#000000");
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 의 내용
http://neodreamer.tistory.com/310의 내용
C++ 프로그래밍에서 헤더의 중복 #include 를 방지하는 방법으로 #pragma once 와 #ifndef 를 활용하는 방법이 있다. 이 두 방법은 모든 컴파일러에서 동작하는 것은 아니다.
우선 사용법을 보면 #pragma once 의 경우 헤더의 상단에 한번 적용 하면 된다.
그리고 #ifndef 를 활용하는 방법은 아래 처럼 define 이 되지 않았을 경우 지정된 값을 지정하여 이후에 다시 불러 들이는 것을 방지한다.
위 두 가지 방법은 여러가지 면에서 차이가 있다.
우선 첫 번째의 경우인 #pragma once 의 경우 컴파일러 지시자로 이를 한번 인식한 후 다음부터 같은 파일의 경우 파일을 읽기조차 하지 않는다. 그래서 컴파일 단계의 파일 해석 단계는 두 번째 방법보다 빠르다. 하지만 컴파일러 지시자로 특정 컴파일러에서만 동작을 한다. 이 지시자는 Visual C++ 5.0 이상에서만 동작을 한다.
두 번째의 경우 모든 컴파일러에서 동작을 하지만 헤더 파일을 여러번 include 를 할 경우 매번 헤더 파일을 열어서 define 여부를 확인해야 하기 때문에 컴파일 과정인 파일 해석 단계에서 첫 번째 방법보다 다소 느리다.
두 가지 방법은 속도와 호환성 문제가 얽혀 있는데 무지 큰 프로젝트가 아닐 경우 속도에서는 크게 차이가 나지 않을 것 같고 Visual C++ 에서만 작업하는 것이 아니라면 호환성을 고려하여 두번째 방법을 사용하는 것이 좋아 보인다.
간단하게 이유를 설명하자면 여러개의 헤더파일과 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 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++ 에서만 작업하는 것이 아니라면 호환성을 고려하여 두번째 방법을 사용하는 것이 좋아 보인다.
'Programming > C++' 카테고리의 다른 글
seekg(0, ios::beg) doesn't work! (0) | 2010.11.28 |
---|---|
#define, #ifdef, #ifndef, #endif (0) | 2010.03.28 |
#pragma once (why it is always attached when we making new class file in visual studio? (0) | 2010.03.28 |
union(공용체)와 BitField (0) | 2010.03.14 |
extern 과 static 의미(지역변수/전역변수/정적변수) (0) | 2010.03.14 |