現在書かれているように、あなたの例はあなたが質問で言及している相互参照を示していません。
コンパイラーは、使用する各タイプについて何かを知らされなければなりません。あなたはheader_1.h
ただで使うことができます:
typedef struct Mode Mode;
typedef struct
{
Mode **modes;
} Library;
それは少なくともそれをコンパイルさせるでしょう。コンパイラは詳細を必要としませんが、それがModes
型であることを知る必要があります。
編集:header_2.h
これが機能するように変更する必要があることに
注意してください。それぞれが1回だけ表示されることを確認する必要がありtypedef
ます。typedefを配置したら、構造体の内容(定義)を1回指定し、構造typedef
体の定義からキーワードとtypedef名を省略します。そして、相互参照が管理されることを正確に決定する必要があります。たとえば、とにかくheader_1.h
含める必要があります。header_2.h
相互に参照する構造が本当に必要だったケースに遭遇したことを覚えていません(非常に長い時間のプログラミングで、例を忘れてしまうほど長い時間でした)。 私は今、相互に参照し合う構造の事例を覚えています。make
もともとMinix用に書かれたバージョンでした。私はまだそのような要件をやや「病的」(または、必要に応じて「コードの臭い」)であり、可能な限り避けるべきものと見なしています。あなたが本当にそれを管理しなければならないのなら、以下のセクションは私がそれをどのように行うか(そして多かれ少なかれmake
プログラムがそれをどのように行ったか)を説明します。
相互参照構造
本当に2つの相互参照構造がある場合は、2つのヘッダーが1つよりも優れていると考える理由を(再)検討する必要があります。それでも2つのヘッダーが必要な場合は、次のようなイディオムを使用します。
header_1.h
#ifndef HEADER_1_H_INCLUDED
#define HEADER_1_H_INCLUDED
#ifndef TYPEDEF_MODE
#define TYPEDEF_MODE
typedef struct Mode Mode;
#endif
#ifndef TYPEDEF_LIBRARY
#define TYPEDEF_LIBRARY
typedef struct Library Library;
#endif
struct Library
{
...
Mode **modes;
...
};
#endif /* HEADER_1_H_INCLUDED */
header_2.h
#ifndef HEADER_2_H_INCLUDED
#define HEADER_2_H_INCLUDED
#ifndef TYPEDEF_MODE
#define TYPEDEF_MODE
typedef struct Mode Mode;
#endif
#ifndef TYPEDEF_LIBRARY
#define TYPEDEF_LIBRARY
typedef struct Library Library;
#endif
struct Mode
{
...
Library **liblist;
...
};
#endif /* HEADER_2_H_INCLUDED */
繰り返されるtypedef
「検出」コードは適切ではありません。私の推定では、単一のヘッダーの方が優れています。header_1.h
ただし、上記のいずれかの順序で含めることができ、header_2.h
コンパイルする必要があります。