-2

#ifndef と #include で C ヘッダーを使用する方法を理解しようとしています。次の 2 つのヘッダー ファイルがあるとします。

ヘッダーA.h:

#ifndef HEADERA_H
#define HEADERA_H

#include "headerB.h"

typedef int MyInt;
TFoo foo;
... some other structures from headerB.h ...

#endif

headerB.h

#ifndef HEADERB_H
#define HEADERB_H

#include "headerA.h"

typedef struct foo{
    MyInt x;
} TFoo;

#endif

ヘッダーA.c

#include "headerA.h"

... some code ...

headerB.c

#include "headerB.h"

... some code ...

headerB.c をコンパイルすると、

In file included from headerB.h,
                 from headerB.c:
headerA.h: error: unknown type name ‘MyInt’

headerB.hがコンパイルされているときにHEADERB_Hを定義し、次に、headerA.hがheaderB.hをインクルードしたい場合、#ifndef HEADERA_His false = インクルードをスキップするためだと思います。

ここでのベストプラクティスは何ですか? ベストプラクティスは#includeヘッダーファイルですべてのディレクティブを実行することですが、この状況では問題のように見えます。

編集:わかりました、誤解を招いて申し訳ありません。これは、より多くのファイルを含むより大きなプロジェクトの単なる例です。

4

2 に答える 2

1

循環依存関係があります。ヘッダーファイルheaderA.hは、依存するheaderB.hものに依存しheaderA.hます。

に含めないheaderB.hなど、その依存関係を壊す必要がありますheaderA.h。必要ありません ( の何も必要ありませんheaderA.hfrom headerB.h)。


(最近の編集で述べたように)含める必要がある場合は、headerB.h最初にヘッダーファイルの使用方法と、どこにどの定義を配置するかを再検討する必要があります。おそらく の定義を に移動MyIntheaderB.hますか? MyIntまたは、タイプ エイリアス用 (個人的には役に立たないと思われるもの)、構造用、変数宣言用など、さらに多くのヘッダー ファイルを用意しますか?

それが不可能な場合は、次のように、定義とインクルードの順序を変更して試すことができます

#ifndef HEADERA_H
#define HEADERA_H

// Define type alias first, and other things needed by headerB.h
typedef int MyInt;

// Then include the header file needing the above definitions
#include "headerB.h"

TFoo foo;
... some other structures from headerB.h ...

#endif
于 2016-11-16T10:18:57.223 に答える
0

ラインを落とすだけ

#include "headerB.h"

ファイル headerA.h から

于 2016-11-16T10:22:19.730 に答える