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

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

DDD
リリース: 2024-12-19 15:18:19
オリジナル
488 人が閲覧しました

Why Do Include Guards Fail to Prevent Recursive Inclusion and Multiple Symbol Definitions?

インクルード ガードが再帰的インクルージョンと複数のシンボル定義を防止しないのはなぜですか?

再帰的インクルージョン

インクルード ガードは再帰的インクルージョンに対する保護を提供しますが、相互インクルードヘッダー内のデータ構造定義間の依存関係を防ぐことはできません。次のコードを考えてみましょう:

// header.h
#ifndef HEADER_H
#define HEADER_H

class A;

class B {
public:
    A* pA;
};

#endif // HEADER_H
ログイン後にコピー
// source1.cpp
#include "header.h"

A* aPtr = new A;
ログイン後にコピー
// source2.cpp
#include "header.h"

B* bPtr = new B;
ログイン後にコピー

このシナリオでは、source1.cpp には header.h が含まれており、これには (間接的に) source2.cpp が含まれます。この動作はインクルード ガードによって防止されますが、クラス A が header.h で定義されていないため、コンパイラは依然としてエラーを報告します。

この問題を解決するには、header.h:

// header.h
#ifndef HEADER_H
#define HEADER_H

struct A;

class B {
public:
    A* pA;
};

#endif // HEADER_H
ログイン後にコピー
これにより、コンパイラはクラス A の定義を提供しなくてもクラス A の存在を認識できるようになります。

複数のシンボル定義

インクルード ガードは、同じ変換単位 (.cpp ファイル) 内で複数のシンボル定義を防止します。ただし、別々の翻訳単位にわたる複数の定義からは保護されません。

次のコードを考えてみましょう:

// header.h
#ifndef HEADER_H
#define HEADER_H

int f() {
    return 0;
}

#endif // HEADER_H
ログイン後にコピー
// source1.cpp
#include "header.h"
int main() {
    f();
}
ログイン後にコピー
// source2.cpp
#include "header.h"
int main() {
    f();
}
ログイン後にコピー
この例では、関数 f() header.h で定義されています。 source1.cpp と source2.cpp が別々にコンパイルされる場合、インクルード ガードにより、各翻訳単位内で複数の定義が行われることが防止されます。ただし、オブジェクト コードがリンクされると、リンカーは f() の複数の定義を検出します。

この問題を解決するには、inline キーワードを使用して、関数定義を直接インライン化するようにコンパイラーに指示できます。 call site:

// header.h
#ifndef HEADER_H
#define HEADER_H

inline int f() {
    return 0;
}

#endif // HEADER_H
ログイン後にコピー
または、関数定義を別の .cpp ファイルに移動して、他の変換の定義との競合を避けることもできます。単位。

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

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