2

多くの.hと.cppを含む小さなC++フレームワークを作成しています。

次のようなすべての.hファイルを含む一般的なインクルードを作成しました。

framework.h

#include "A.h"
#include "B.h"
#include "C.h"

各.hヘッダーは、次のようなインクルードガードで保護されています

#ifndef A_HEADER
#define A_HEADER
...
#endif

問題は、などのすべてのsub .h内に「framework.h」を含めることができるようにしたいのですが、多くのコンパイラエラーが発生します。

#ifndef A_HEADER
#define A_HEADER

#include "framework.h"
...
#endif

代わりに、各サブヘッダーに実際のヘッダーファイルを使用し、フレームワークを使用するものにframework.hを使用すると、正常に機能します。

すべてのサブ.h内にメインヘッダーを含めたいので、毎回すべての依存関係を含める必要はありません。

ありがとう :)

4

6 に答える 6

7

基本的#include "A.h"に、framework.hと#include "framework.h"Ahで行うことは、ヘッダーファイルの循環依存を引き起こし、未定義のクラスAなどのエラーが発生します。これを解決するには、ヘッダーファイルと#include対応するcppファイルでのみ前方宣言を使用します。それが不可能な場合は、個々のヘッダーファイルを含める以外のオプションは表示されません。

于 2010-05-19T14:51:54.307 に答える
2

インクルードガードでメインヘッダーを保護するだけです。

#ifndef FRAMEWORK_H
#   define FRAMEWORK_H
#   include <A.h>
#   include <B.h>
#   include <C.h>
#endif

これにより、再帰的な包含が防止されます。

于 2010-05-19T14:46:43.663 に答える
2

サブヘッダーファイル内にメインヘッダーファイルを含めないでください。これは、ユーザーの生活を楽にするために使用する必要があります。あなたの生活を楽にするためではありません。

代わりに、次のようにしてください。

1)関連するサブヘッダーファイルで必要なすべての定義を転送します。

2)必要なサブヘッダーファイルのみをCPPファイルにインクルードします。

3)アプリケーションコード内でフレームワークを使用する場合(たとえば)、メインフレームワークヘッダーファイルをインクルードできます。

于 2010-05-19T15:20:59.337 に答える
0

#pragmaを1回使用し、それをすべてのヘッダーファイル(framework.h、Ah、Bh、およびCh)の先頭に配置することをお勧めします。

ただし、必要に応じて、framework.hにもインクルードガードを配置するだけで問題を解決できると思います。

于 2010-05-19T14:45:26.670 に答える
0

BとCの間に依存関係があると思います。たとえば、BはCに依存しますが、framework.hではCはBの後に含まれます。

于 2010-05-19T14:55:00.493 に答える
0

循環インクルードは、C++では一般的に悪い考えです。ヘッダーガードを使用すると、プリプロセッサが無限ループに陥る(またはこのためにエラーがスローされる)のを防ぐことができますが、予期しないコンパイラエラーが発生します。これは、ある時点でヘッダーファイルがインクルードされていると思われる場合にインクルードされないためです。

A.hB.hおよびC.hfromframework.hを含める必要があり、、にはA.h含めないframework.hでください。使用するクラスを前方宣言するだけです。または、逆の方法で行います。from、、、をインクルードframework.hA.h、のクラスを前方宣言します。そしてもちろん、たとえば.cppファイルよりも詳細な宣言を必要とするすべてのコードを配置します。B.hC.hframework.hclass A

于 2010-05-19T14:59:02.170 に答える