ホームページ >バックエンド開発 >C++ >インクルード ガードは相互再帰と複数のシンボル定義をどのように処理しますか?

インクルード ガードは相互再帰と複数のシンボル定義をどのように処理しますか?

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。クラス 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

複数の定義

インクルード ガードは、単一の翻訳単位内の複数の定義から保護しますが、異なる単位間では保護しません。説明すると、

// 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() の複数の定義についてエラーを出します。解決策は、関数を 1 つの翻訳単位のみで定義するか、 inline キーワードを使用して各呼び出しサイトで関数本体をインライン化するようにコンパイラーに指示することです。

以上がインクルード ガードは相互再帰と複数のシンボル定義をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。