ホームページ > バックエンド開発 > C++ > C で循環ヘッダーの組み込みを回避するにはどうすればよいですか?

C で循環ヘッダーの組み込みを回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-26 15:26:02
オリジナル
1042 人が閲覧しました

How Can Circular Header Inclusion Be Avoided in C  ?

C で相互にインクルードされるヘッダー

C ヘッダー ファイルは相互にインクルードできますが、コンパイル エラーを避けるために特定のガイドラインに従う必要があります。

Include ステートメントの配置

include ステートメントは、複数のインクルードを防ぐために、インクルード ガードとして知られるプリプロセッサ マクロの内側に配置する必要があります。これは、ヘッダーが相互にインクルードされている場合に特に重要です。

前方宣言

2 つのクラス A と B が相互にインクルードされている次のコードを考えてみましょう。

<code class="cpp">// A.h

#ifndef A_H_
#define A_H_

#include "B.h"

class A
{
public:
    A() : b(*this) {}

private:
    B b;
};

#endif</code>
ログイン後にコピー
<code class="cpp">// B.h

#ifndef B_H_
#define B_H_

#include "A.h"

class B
{
public:
    B(A& a) : a(a) {}

private:
    A& a;
};

#endif</code>
ログイン後にコピー

このシナリオでは、コンパイラーは最初にクラス B に遭遇しますが、A はまだ宣言されていません。これを解決するには、B の定義の前に A の 前方宣言 を含める必要があります。

<code class="cpp">// B.h

#ifndef B_H_
#define B_H_

class A;  // Forward declaration of class A

#include "A.h"

class B
{
public:
    B(A& a) : a(a) {}

private:
    A& a;
};

#endif</code>
ログイン後にコピー

この前方宣言は、完全な定義であっても、A がクラスであることをコンパイラーに通知します。はまだ利用できません。

実際

一般に、#include ステートメントはインクルード ガードの内側に配置する必要があり、ヘッダーが参照する必要がある場合は前方宣言を使用する必要があります。後でインクルードされるヘッダーで定義されるクラスに追加します。これらのガイドラインに従うことで、循環インクルードによって発生するコンパイル エラーを回避できます。

以上がC で循環ヘッダーの組み込みを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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