ホームページ > バックエンド開発 > C++ > インクルード ガードが相互再帰と複数の定義を防止できないのはなぜですか?

インクルード ガードが相互再帰と複数の定義を防止できないのはなぜですか?

Susan Sarandon
リリース: 2024-12-30 17:20:17
オリジナル
277 人が閲覧しました

Why Do Include Guards Fail to Prevent Mutual Recursion and Multiple Definitions?

インクルード ガードが相互の再帰的包含を防止しないのはなぜですか?

インクルード ガードはヘッダー ファイルを相互の再帰的包含から保護します。 >

相互包含におけるデータ構造の定義間に依存関係がある場合に問題が発生します。ヘッダー。例:

// a.h
#include "b.h"

struct A
{
    ...
};

// b.h
#include "a.h"

struct B
{
    A* pA; // error: class A is forward-declared but not defined
};
ログイン後にコピー
これを解決するには、インクルード ガードの代わりに前方宣言を使用する必要があります:

// b.h
#include "a.h"

// Forward declaration of A
struct A;

struct B
{
    A* pA;
};
ログイン後にコピー
なぜインクルード ガードで複数の定義が防止されないのですか?

インクルード ガードは、同じ翻訳単位内の冗長なインクルードからヘッダーを保護します。ただし、異なる翻訳単位に存在するため、複数の定義が発生する可能性があります。

これを解決するには、inline キーワードを使用して、異なる翻訳単位で複数の定義を許可できます。

あるいは、関数定義を別のソース ファイルに移動して、複数の定義を避けることもできます:

// header.h
inline int f()
{
    ...
}
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート