2012-11-12 3 views
33

enter image description here#include guard와 #pragma를 한 번 사용해야합니까? 이 컴파일러의 모든 <code>#pragma once</code>를 지원하는 경우

http://en.wikipedia.org/wiki/Pragma_once
난 아직도 사용해야 경비원 포함되어 있습니까?
스택 오버플로에 대한 많은 응답은 호환성을 위해 둘 다 사용한다고 말하지만 여전히 그래도 울리는 지 확실하지 않습니다. 현재 어떤 컴파일러가 #pragma once을 지원하지 않습니까?

양쪽 모두를 사용하는 것이 widley 채택되기 전에 권장 사항 이었는지 또는 두 가지 방법을 사용하는 여전히 좋은 이유가 있는지 확실하지 않습니다.
#pragma once 만 사용하면 어떤 문제가 발생합니까?

+11

는 누구의 소스 배포하는 다음 프라그가 작동하지 않을 수 있습니다 오픈 소스 프로그램을 만들고 있어요 그래서 만약 나열된 컴파일러의 이전 버전이 그것을 지원하지 않을 수 있음을 기억하십시오. –

+5

컴파일러 지원뿐만 아니라 환경이 얼마나 복잡한 지에 따라 달라집니다. 두 파일 모두 netwowrk 마운트 및 심볼릭 링크를 포함하여, 동일 여부를하면 당신은 * 확실히 알 수있는 컴파일러 *을 신뢰합니까? –

+2

은 인덱서 및 분석기와 같은 보조 도구도 고려합니다. 컴파일러를 위해있는 것처럼 전 처리기 나 파서가 뒤에 없을 수도 있습니다. 임베디드 시스템의 – justin

답변

13

을 포함 있도록 비표준입니다.

확실하게 #prama once을 지원하는 컴파일러로 작업해야하는 프로그램을 작성하고 있다면 #pragma once을 사용하면됩니다. 하지만 이렇게하면 구현 정의 함수를 지원하는 컴파일러 세트로 프로그램을 제한 할 수 있습니다.

귀하의 프로그램이 모든 컴파일러에서 작동해야하는 경우 #pragma once을 사용하고 경비원을 모두 포함시켜야합니다. 컴파일러가 지원하지 않는 경우

#pragma once 그것은 단순히 [참고 문헌이 # 1], 이러한 경우에 헤더 가드 당신이 인식하지 둘 때, 당신이 그들을 사용의 잘못 때문에 아무 목적으로 서비스를 제공하지 않습니다 무시합니다 타겟 컴파일러가 지원하는 기능들.

다른 컴파일러에서 프로그램을 100 % 이식 가능하게하려면 이상적인 방법은 여전히 ​​포함 가드 만 사용하는 것입니다. #pragma once에 대한 동작이 구현 정의 된 이후 @CharlesBailey가 올바르게 지적한 것처럼 알 수없는 컴파일러에서의 동작은 프로그램에 해로운 영향을 줄 수 있습니다.


[참고 문헌 1]
표준 C++ 03 : 16.6 프라 그마 지정

형태

# pragma pp-tokensopt new-line

의 전처리 지시자 원인 구현은 구현 정의 된 방식으로 동작합니다. 구현에서 인식 할 수없는 pragma는 무시됩니다. 테이블로

+7

프로그램을 100.00 % 이식 가능하게하려면 포함 가드를 사용해야하지만 또한 #pragma once를 사용하지 않아야합니다. 알 수없는 컴파일러는 프로그램에 해로운 영향을 줄 수 있습니다. –

+0

@CharlesBailey : 동의 함. 대답을 수정해야합니다. 나는 그렇게 할 것입니다. 지적 해 주셔서 감사합니다. –

+3

'같은 파일은 운영 시스템/파일 시스템 레벨에서 두 개의 서로 다른 이름으로 별명 경우의 #pragma once'가 실패합니다. 그러나 파일의 #include-guard는 파일 시스템 참조에 관계없이 동일한 이름을 가지며 여전히 작동합니다. – abelenky

10

당신이 안전한 사용을 할하려는 경우 그것은 당신의 프로그램이 될 것으로 예상 얼마나 많은 휴대용에 따라 경비

5

#pragma once를 지원하지 않는 주류 사용 컴파일러가 발생할 지금 매우 드문 보여줍니다. 코드 기반을 깨끗하게 유지하고 유지 보수 비용을 줄이기 위해서는 지속적인 리팩토링 노력이 필요합니다. 클래스의 이름을 바꾸거나 코드를 옮길 때마다 경비원을 업데이트하면 상당한 부담이됩니다.

그래서 나는 떨어져 약간의 틈새 코너 케이스에서 말하거나 #pragma once에 의존하는 것이 안전 실천에 깨진 빌드 시스템을위한 것입니다. #pragma once 만 사용하여 생산성과 코드 품질을 신경 쓰는 분명한 선택입니다. 당신이 태양 아래 모든 컴파일러를 지원하거나이 기능이없는이 드문 컴파일러 중 하나 일해야 할만큼 불행 할 필요가있는 라이브러리를 작성하는 경우 인

예외.