1

Cでインクルージョンサイクルを防ぐにはどうすればよいですか? すなわち。ah #include "bh"、#include の "ch"、#include の "ah" は使用しないでください。ある種の C ディレクティブを使用して、これが起こらないようにする方法を探しています。

私は当初、これがこれを防ぐと思っていました:

ああの内容:

#ifndef __A_H
#define __A_H

#include "b.h"

#endif // __A_H

bh の内容:

#ifndef __B_H
#define __B_H

#include "c.h"

#endif // __B_H

chの内容:

#ifndef __C_H
#define __C_H

#include "a.h"

#endif // __C_H

しかし、うまくいかないようです。

4

5 に答える 5

7

ファイル繰り返しインクルードされますが、 #ifdndef/#define/#endif で保護されたセクションは繰り返され、サイクルが壊れます。

コンパイラを使用して前処理された出力を生成し、自分で確認してください。GNU CC では、次のように .c[pp] ファイルで "-E" オプションを使用する必要があります。

gcc -E $(CFLAGS) -o foo.i foo.cpp
于 2008-11-07T23:36:43.017 に答える
1

上記に加えて、turbo c で作業していて、これらのソース ファイルを使用してプロジェクトを実行している場合は、ソース ファイルに #include されているヘッダー ファイルを添付しないでください。それでも機能しない場合は、試してください。一部のコンパイラ オプションではこれらのエラーが何度も発生するため、コマンド プロンプトから実行します。ヘッダー ファイルの内容が #ifndef と #endif の間にある場合は、両方のファイルを含めても問題ありません。したがって、ヘッダー ファイルをプロジェクトから削除して、それらを同じディレクトリに保持してみてください。bcos 環境を指定しませんでした。ターボ C を指定したのは、ヘッダー ファイルがソース ファイルに #include され、プロジェクト ファイル リストに添付された状態でターボ C でこの状況に直面したためです。次に、「複数宣言の問題」が発生します。

于 2008-11-12T11:30:28.737 に答える
1

アンダースコアで始まるマクロは、プリプロセッサ/コンパイラ用に予約されています。

__*_H をより標準的なものに変更してみてください。
私は HAVE__*_H を使用しています。

于 2008-11-07T23:37:40.080 に答える
1

それはうまくいくはずです。あなたの例では正しく書かれており、私にとってはうまくコンパイルされます。実際のコードで何かを間違って入力しましたか、それとも実際に発生している他の問題ですか?

ただし、コンパイラやシステム ライブラリ用に予約されているため、__ から始めるべきではありません。警備員に別の名前を付けてみてください。

于 2008-11-07T23:38:08.410 に答える
0

これは機能します。

念のため、実際に ah を含む test.c を 3 つのヘッダー ファイルにコンパイルしました。

これが MSVC、Digital Mars、および GCC のいくつかのバージョンで機能することを確認しました。

于 2008-11-07T23:39:44.443 に答える