15
4

3 に答える 3

27

インクルードをどのように順序付けたかにより、コンパイラvoid some_func(my_structure *x);typedef struct abcd { int a; } my_structure;.

これを見ていきましょう。

が最初に処理されると仮定するとmy_struct.h、次の一連のイベントが得られます。

  1. UTILSH定義されています
  2. MAINH定義されています
  3. UTILSHは既に定義されているため、再度処理しないためmy_struct.h、typedef は処理されません。
  4. void some_func(my_structure *x);処理されます。
  5. これでが処理されますtypedef

したがって、前処理の後、コンパイラは次の一連の宣言を確認します。

...
void some_func(my_structure *x);
...
typedef struct abcd {...} my_structure;

悪いジュジュ。my_structureinの前方宣言が必要か、main.hその循環依存関係を解消する必要があります (これは非常に好ましいオプションです)。実際に使っmain.hているものはありますか?その場合は、とインクルードmy_structure.hの両方を含む別のファイルに分割する必要があります。main.hmy_structure.h

于 2013-09-19T19:34:34.947 に答える
8

循環ヘッダー インクルードを作成しました。循環的な包含は何も達成しません。それは無限です。インクルード ガードは、#ifndef(どのヘッダーが.c最初にファイルにインクルードされるかによって) 予測不可能なポイントで無限のインクルージョン サークルを壊します。これがあなたの場合に起こったことです。main.h基本的に、あなたの循環包含は最初と2番目を含むように「解決」されましmy_struct.hた。これが、タイプmain.hについて何も知らない理由です。my_struct

繰り返しますが、循環的な包含は何も達成しません。循環包含を取り除きます。ヘッダー構造を階層的に設計します。下位レベルのヘッダーを上位レベルのヘッダーに含めますが、その逆は絶対にしないでください。あなたの場合my_struct.h、おそらく下位レベルのヘッダーです。つまり、へのインクルードを停止する必要がありmain.hますmy_struct.hmy_struct.hが不要になる ようにヘッダーを再設計しますmain.h

于 2013-09-19T19:32:58.870 に答える
3

が定義される前に、にmain.h含まれている間にエラー メッセージが表示されます。インクルードパスを再考し、相互に含める必要があります。my_struct.hmy_structuremain.hmy_struct.h

おそらく、main.hファイルに を含めるだけで、何も含めるmy_struct.h必要はありませんmy_struct.h。基本的に、無限の co-include ループを持つように C コンパイラに指示しています。

于 2013-09-19T19:30:27.197 に答える