문제

Codegear Rad Studio 2009에서 '중복 포함'가 필요합니까? 컴파일러가 자체적으로 이것을 다루기에 충분히 똑똑합니까?

예를 들어 Foo.h에 다음과 같은 '가드 포함'이있을 수 있습니다.

#ifndef fooH
#define fooH
// ... declaration here
#endif

그리고 다음과 같은 '중복은 aust_foo.h에서 가드 포함'입니다.

#ifndef fooH
    #include "foo.h"
#endif

또한 컴파일러가 충분히 똑똑하지 않은 경우 소스 파일에 포함 된 경우 '중복 포함'Necesarry가 있습니다. 예를 들어 use_foo.cpp. ?

도움이 되었습니까?

해결책

"중복 포함 가드"로 표시된 코드의 일부는 필요하지 않지만 가능한 최적화.

C ++ Builder의 경우 헤더 가드를 감지하는 논리가 있으므로 필요하지 않아야합니다.

일반적으로 전처리 패스는 일반적으로 어쨌든 매우 빠르므로 가능성은 거의 없습니다. 이것 최적화는 어쨌든 당신을 많이 살 것입니다.

다른 팁

이러한 중복 포함 경비원은 제안 된 기능의 기능을 모방하기위한 것입니다. #pragma once 지침 : 일부 헤더 파일이 이미 포함 된 경우, 전처리 기는 더 이상 찾아서 열고 구문 분석하려고 시도하지 않습니다 ( "일반"포함 된 가드 기술과 마찬가지로). 많은 경우에 이것은 포함 된 파일의 처리가 훨씬 더 효율적입니다 (속도가 빠른 편집).

이 접근법은 분명히 높은 유지 보수입니다. 가드 기호의 철자가 헤더 파일 내부와 외부 내부에서 정확히 동일해야합니다.

"중복 포함 된 가드 포함", 당신이 부르는대로, 편집 속도를 높입니다.

중복 가드가 없으면 컴파일러는 전체 foo.h 파일을 반복하여 외부에있을 수있는 코드를 찾습니다. #ifndef 차단하다. 긴 파일이고 많은 장소에서 이루어지면 컴파일러는 많은 시간을 낭비 할 수 있습니다. 그러나 중복 가드를 사용하면 전체를 건너 뛸 수 있습니다. #include 진술하고 해당 파일을 다시 열지 마십시오.

물론, 당신은 foo.h를 통해 반복하는 컴파일러에 의해 낭비되는 실제 시간을 실험하고 실제로 아무것도 컴파일하지 않아야합니다. 그리고 아마도 최신 컴파일러는 실제로이 패턴을 찾고 자동으로 파일을 전혀 열지 않는다는 것을 자동으로 알고 있습니다.

(280z28에 의해 편집 시작)

다음 헤더 구조는 다음으로 인식됩니다 적어도 GCC 및 MSVC. 이 패턴을 사용하면 파일 포함 경비원으로 얻을 수있는 거의 모든 이점을 무효화합니다. 컴파일러가 구조를 검사 할 때 주석은 무시됩니다.

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(종료 편집)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top