包含防護確實可以保護你的頭文件來自相互的、遞歸的包含。之所以會出現混亂,是因為問題不在於守衛,而在於頭檔中資料結構的定義方式。
考慮這個例子:
// 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() { ... }
即使使用包含守衛,main. cpp 將無法編譯,因為類 A(類 B 所需)的定義不完整。前向聲明解決了此問題:
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
包含防護措施,可以防止單一翻譯單元內出現多個定義,但不能跨不同單元。舉例來說:
// 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" ...
即使有包含保護,連結器也會抱怨 f() 的多個定義。解決方案是僅在一個翻譯單元中定義函數,或使用 inline 關鍵字指示編譯器在每個呼叫點內聯函數體。
以上是Include Guards 如何處理相互遞歸和多個符號定義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!