3 に答える
インクルードをどのように順序付けたかにより、コンパイラvoid some_func(my_structure *x);
はtypedef struct abcd { int a; } my_structure;
.
これを見ていきましょう。
が最初に処理されると仮定するとmy_struct.h
、次の一連のイベントが得られます。
UTILSH
定義されていますMAINH
定義されていますUTILSH
は既に定義されているため、再度処理しないためmy_struct.h
、typedef は処理されません。void some_func(my_structure *x);
処理されます。- これでが処理されます
typedef
。
したがって、前処理の後、コンパイラは次の一連の宣言を確認します。
...
void some_func(my_structure *x);
...
typedef struct abcd {...} my_structure;
悪いジュジュ。my_structure
inの前方宣言が必要か、main.h
その循環依存関係を解消する必要があります (これは非常に好ましいオプションです)。実際に使っmain.h
ているものはありますか?その場合は、とインクルードmy_structure.h
の両方を含む別のファイルに分割する必要があります。main.h
my_structure.h
循環ヘッダー インクルードを作成しました。循環的な包含は何も達成しません。それは無限です。インクルード ガードは、#ifndef
(どのヘッダーが.c
最初にファイルにインクルードされるかによって) 予測不可能なポイントで無限のインクルージョン サークルを壊します。これがあなたの場合に起こったことです。main.h
基本的に、あなたの循環包含は最初と2番目を含むように「解決」されましmy_struct.h
た。これが、タイプmain.h
について何も知らない理由です。my_struct
繰り返しますが、循環的な包含は何も達成しません。循環包含を取り除きます。ヘッダー構造を階層的に設計します。下位レベルのヘッダーを上位レベルのヘッダーに含めますが、その逆は絶対にしないでください。あなたの場合my_struct.h
、おそらく下位レベルのヘッダーです。つまり、へのインクルードを停止する必要がありmain.h
ますmy_struct.h
。my_struct.h
が不要になる ようにヘッダーを再設計しますmain.h
。
が定義される前に、にmain.h
含まれている間にエラー メッセージが表示されます。インクルードパスを再考し、相互に含める必要があります。my_struct.h
my_structure
main.h
my_struct.h
おそらく、main.h
ファイルに を含めるだけで、何も含めるmy_struct.h
必要はありませんmy_struct.h
。基本的に、無限の co-include ループを持つように C コンパイラに指示しています。