首頁 >後端開發 >C++ >Include Guards 如何處理相互遞歸和多個符號定義?

Include Guards 如何處理相互遞歸和多個符號定義?

DDD
DDD原創
2024-12-23 06:17:20395瀏覽

How Do Include Guards Handle Mutual Recursion and Multiple Symbol Definitions?

為什麼包含防護不提供相互遞歸保護或防止多個符號定義?

相互遞歸

包含防護確實可以保護你的頭文件來自相互的、遞歸的包含。之所以會出現混亂,是因為問題不在於守衛,而在於頭檔中資料結構的定義方式。

考慮這個例子:

// 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn