왜 포함하지 않습니까? 내 헤더 파일을 상호, 재귀로부터 보호하는 경비원 포함?
포함 경비원이 제 역할을 하고 있습니다. 문제는 상호 포함 헤더의 데이터 구조 정의 간의 종속성으로 인해 발생합니다.
예를 들어 a.h 및 b.h에 다음이 포함되어 있다고 가정합니다.
// a.h #ifndef A_H #define A_H #include "b.h" struct A {...}; #endif // b.h #ifndef B_H #define B_H #include "a.h" struct B {...}; #endif
include 가드가 없으면 main.cpp는 컴파일 깊이 제한으로 인해 컴파일됩니다.
Include Guard를 사용하면 무한 재귀를 방지할 수 있습니다. 그러나 정의 간의 종속성은 그대로 유지됩니다.
이 문제를 해결하려면 필요한 헤더에 전방 선언을 사용하세요.
// b.h #ifndef B_H #define B_H struct A; // Forward declaration struct B {...}; #endif
포함하지 않는 이유 가드가 여러 정의를 방지합니까?
경비를 포함하면 방지할 수 있습니다. 단일 번역 단위 내에서 재정의하지만 다른 단위에 걸쳐 재정의하지는 않습니다.
예를 들어 header.h:
#ifndef HEADER_H #define HEADER_H int f() {...}; #endif
source1.cpp 및 source2와 같은 여러 번역 단위에 포함되는 경우입니다. cpp:
// source1.cpp #include "header.h" // source2.cpp #include "header.h"
링커는 별도의 개체에서 동일한 정의를 보기 때문에 f()의 여러 정의에 대해 불평합니다. files.
이 문제를 해결하려면 다음 접근 방식을 사용하세요.
위 내용은 내 포함 가드가 재귀 포함 및 다중 기호 정의를 방지하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!