2014-01-22 1 views
4

나는 잠시 동안 헤더 파일에서 경비원을 사용하고 있는데, 왜 그들이 사용되는지 이해하는 유일한 이유는 컴파일하는 동안 (경비원을 고려중인 헤더 파일)을 포함하는 것입니다.C 헤더 포함 파일은 헤더 파일에만 사용되지만 .c 파일에는 사용되지 않습니다. 왜?

헤더 가드를 사용하는 다른 이유가 있는지, 왜 그들이 .c 파일에서 사용되지 않는지 알고 싶습니다. 또한 가드가 .c 파일에도 사용되는 경우 어떻게됩니까?

Ans. 아래의 답변에서 수집했습니다.

일반적으로 모든 정의는 .c 파일로 이동되고 헤더 파일 (.h 파일)에는 모든 선언이 포함됩니다. .c 파일을 포함하는 것은 좋지 않습니다.

번역 단위에만 해당하는 컴파일 중에 .c 파일에 사용할 수있는 선언을 하나만 포함하도록 연결하려면 (즉, 링크해야하는 라이브러리가 두 개 이상인 경우, 즉 두 개 이상의 번역 단위를 가짐). 헤더 가드는 헤더 파일을 한 번만 포함시키는 데 도움이됩니다.

이는 파일 (.o 확장자) 파일을 얻기 위해 컴파일 된 파일이되기 전의 전처리 기 때문에 발생합니다. 프리 프로세서 스테이지는 전체 매크로를 대체하고 .h 파일을 한 번만 포함 할 수있는 관련 데이터를 포함합니다.

+0

'#include "foo.h"'를 두 번 쓰면 foo.h의 내용이 두 번 포함됩니다. 그래서 경비가 필요합니다. 이제 "bar.c"를 작성했다고 가정하고 빌드 스크립트에 어떤 이유로 든 두 번 컴파일하도록 지시했습니다. 처음으로 컴파일하면'bar.o'가 생성되고, 두 번 컴파일하면'bar.o'를 다시 덮어 씁니다. 그래서 소스 파일을 보호 할 필요가 없습니다. – Brandin

답변

11

헤더 가드가 수행하는 작업은 프로젝트에 여러 포함을 방지하는 것이 아니라 하나의 translation unit에서만 수행합니다.

예를 들어 두 개의 헤더 파일 인 a.hb.h이 있다고 가정 해 보겠습니다. b.h 헤더 파일은 a.h을 포함하고 a.hb.h이 모두 소스 파일 s.c에 포함되어 있습니다. 헤더 가드가 없으면 a.h 파일이 두 번 포함되어 오류가 발생할 수 있습니다. 헤더 파일에 헤더 가드가있는 경우 a.h 파일은 한 번만 포함됩니다.

일반적으로 에 다른 파일에이 포함되어 있지 않으므로 소스 파일에 헤더 가드가 필요하지 않습니다.

+0

요아킴에 감사드립니다. 그러나 .c 파일에서 경비원을 사용해야 할 경우가 있었는데, 그 경우에는 언제 그럴까요? –

+1

@AditYa 진정한 초심자 서클 (소스 파일을 따로 컴파일하는 대신'# include' 소스 파일에 공통적 인 경우가 있습니다.)에서 소스 파일을 포함하고있는 경우에는 매우 신중하게 준비되어 있기 때문에 두 번 포함되지 않습니다. 단일 번역 단위이므로 헤더 가드가 필요하지 않습니다. 일반적으로 소스 파일을'# include '하지 마라. 그렇다면 걱정할 필요가 없습니다. –

+0

@AditYa 어떤 이유로 myheaderfile.c 규칙을 사용하여 헤더 파일의 이름을 지정하기로 결정한 경우 해당 파일에 포함 보호를 사용합니다. 결국, 이름의'.c'는 순전히 컨벤션 (그러나 명백하게 좋은 컨벤션)입니다. – Brandin

2

언급 한 것처럼 헤더 가드의 주요 목적은 중복 포함을 방지하기 위해서입니다.

는 다음과 같은 예를 생각해

당신이 당신이 'example_1.h''example_2.h' 문 (매크로)를 포함는 'C'파일에 컴파일 단위

example_1.h 
example_2.h (includes example_1.h) 

에서 다음 헤더 파일

'#include example_1.h' 두 번 실행됩니다.

당신이 라인을 추가 할 때

#ifdef EXAMPLE_1 
#define EXAMPLE_1 


#endif 

당신이 사용법 #include 매크로를 정의, 아주 처음 example_1.h encouter 때 시스템을 컴파일 말하고있다 example_1.h (이 매크로는 빌드에 로컬 시스템). 나는 이미 example_1.h를 포함했다는 것을 나에게 알려주고있다. 다음번 엔 #include example_1.hEXAMPLE_1이 빌드 시스템 에 실제로 정의되어 있고 건너 뛴다는 것을 알게 될 것이다.

작은 예제에서는 사소한 것처럼 보이지만 수백 개의 파일이 포함 된 대규모 프로젝트에서 이것은 매우 유용한 기능입니다. 그리고 .c files은 다른 파일에 포함되지 않기 때문에 포함하지 않는 것이 좋습니다. .c files 이하.