私は、#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.hがheaderB.hを含める場合、#ifndef HEADERA_H
はfalse =スキップします。
ここでベストプラクティスは何ですか?私はちょうど、ベストプラクティスは、すべての#include
指示をヘッダーファイルで行うことですが、この状況では問題のように見えます。
編集:ありがとうございます。ご迷惑をおかけして申し訳ありません。これは、より多くのファイルを持つより大きなプロジェクトの単なる例です。
感謝、私の質問に答えた。だから、ヘッダーファイルを作り直すかベストプラクティスを破るだけでなく、headerB.cのheaderB.hにheaderA.hをインクルードするという単純な解決策はありません。 – Risinek
@Risinek循環依存性は悪い設計です。あなたがそこから何かを派生させるものを含めると、あなたが含むものにもあなたから何かが必要な理由はありません。 –