2016-11-16 31 views
-2

私は、#ifndefと#includeでCヘッダーを使用する方法を理解しようとしています。Cヘッダーファイル#ifndef #includeエラー

headerA.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 

headerA.c

#include "headerA.h" 

... some code ... 
は、私はこれらの2つのヘッダファイルがあるとしましょうheaderB.cをコンパイル

headerB.c

#include "headerB.h" 

... some code ... 

、それは私が考える

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

が、それはheaderB.hがコンパイルされたときにbecouseだ、それはその後、HEADERB_Hを定義し、言いますheaderA.hheaderB.hを含める場合、#ifndef HEADERA_Hはfalse =スキップします。

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

編集:ありがとうございます。ご迷惑をおかけして申し訳ありません。これは、より多くのファイルを持つより大きなプロジェクトの単なる例です。

答えて

1

あなたは循環依存性を持っています。ヘッダーファイルheaderA.hheaderB.hに依存し、headerA.hなどに依存します。

あなたはheaderA.hheaderB.h含むないにより、たとえば、その依存関係を壊すする必要があります。それは必要ではありません(headerA.hの何物もheaderB.hから何も必要ありません)。


あなたは(あなたの最近の編集に記載されているように)headerB.hを含める必要があれば、あなたは最初にあなたがあなたのヘッダファイルを使用する方法を見直す必要があり、どのような定義あなたはどこに置きます。おそらくMyIntの定義をheaderB.hに移動しますか?あるいは、私が個人的に使用しないと思っているMyIntのようなタイプのエイリアスのようなヘッダファイルを1つ、構造体のためのものと変数宣言のためのもののように多く持っていますか?

それができないならば、あなたは定義の順序を変更して試してみて含めることができ、

#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 
+0

感謝、私の質問に答えた。だから、ヘッダーファイルを作り直すかベストプラクティスを破るだけでなく、headerB.cのheaderB.hにheaderA.hをインクルードするという単純な解決策はありません。 – Risinek

+0

@Risinek循環依存性は悪い設計です。あなたがそこから何かを派生させるものを含めると、あなたが含むものにもあなたから何かが必要な理由はありません。 –

0

のように単にファイルからの行に

#include "headerB.h" 

をドロップheaderA.h

+0

それは私の問題のための解決策ではないので、私はheaderA.hから他の構造と関数が必要です。編集した質問 – Risinek

関連する問題