포함 가드는 실제로 헤더 파일을 보호합니다. 상호적이고 재귀적인 포함으로부터. 문제가 가드에 있는 것이 아니라 헤더 파일에서 데이터 구조가 정의되는 방식에 있기 때문에 혼란이 발생합니다.
예를 고려하세요.
// a.h #ifndef A_H #define A_H #include "b.h" struct A { ... }; #endif // A_H // b.h #ifndef B_H #define B_H #include "a.h" struct B { A* pA; }; #endif // B_H // main.cpp #include "a.h" int main() { ... }
인클루드 가드가 있어도 메인입니다. 클래스 A(클래스 B에 필요함)에 불완전한 정의가 있으므로 cpp는 컴파일에 실패합니다. 전방 선언으로 이 문제가 해결됩니다.
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
Include Guard는 단일 번역 단위 내의 다중 정의로부터 보호하지만 다른 단위 전체에서는 보호하지 않습니다. 설명하자면:
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H // source1.cpp #include "header.h" // Redundant include causing multiple definitions #include "header.h" int main() { ... } // source2.cpp #include "header.h" ...
include 가드가 있어도 링커는 f()의 여러 정의에 대해 불평합니다. 해결책은 하나의 번역 단위에서만 함수를 정의하거나 inline 키워드를 사용하여 각 호출 사이트에서 함수 본문을 인라인하도록 컴파일러에 지시하는 것입니다.
위 내용은 가드 포함은 상호 재귀 및 다중 기호 정의를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!