나는 잠시 동안 헤더 파일에서 경비원을 사용하고 있는데, 왜 그들이 사용되는지 이해하는 유일한 이유는 컴파일하는 동안 (경비원을 고려중인 헤더 파일)을 포함하는 것입니다.C 헤더 포함 파일은 헤더 파일에만 사용되지만 .c 파일에는 사용되지 않습니다. 왜?
헤더 가드를 사용하는 다른 이유가 있는지, 왜 그들이 .c 파일에서 사용되지 않는지 알고 싶습니다. 또한 가드가 .c 파일에도 사용되는 경우 어떻게됩니까?
Ans. 아래의 답변에서 수집했습니다.
일반적으로 모든 정의는 .c 파일로 이동되고 헤더 파일 (.h 파일)에는 모든 선언이 포함됩니다. .c 파일을 포함하는 것은 좋지 않습니다.
번역 단위에만 해당하는 컴파일 중에 .c 파일에 사용할 수있는 선언을 하나만 포함하도록 연결하려면 (즉, 링크해야하는 라이브러리가 두 개 이상인 경우, 즉 두 개 이상의 번역 단위를 가짐). 헤더 가드는 헤더 파일을 한 번만 포함시키는 데 도움이됩니다.
이는 파일 (.o 확장자) 파일을 얻기 위해 컴파일 된 파일이되기 전의 전처리 기 때문에 발생합니다. 프리 프로세서 스테이지는 전체 매크로를 대체하고 .h 파일을 한 번만 포함 할 수있는 관련 데이터를 포함합니다.
'#include "foo.h"'를 두 번 쓰면 foo.h의 내용이 두 번 포함됩니다. 그래서 경비가 필요합니다. 이제 "bar.c"를 작성했다고 가정하고 빌드 스크립트에 어떤 이유로 든 두 번 컴파일하도록 지시했습니다. 처음으로 컴파일하면'bar.o'가 생성되고, 두 번 컴파일하면'bar.o'를 다시 덮어 씁니다. 그래서 소스 파일을 보호 할 필요가 없습니다. – Brandin