register.hとaddrmode.hという名前の他の2つのヘッダーを含むcpu.hという名前のファイルがあります。cpu_t構造体はcpu.hで定義されており、2つにはそれらの関数の必要性が含まれています。他の2つのインクルードファイルにcpu.hをインクルードしようとしましたが、何もインクルードされていません。cpu.hにインクルードガードが設定されているため、含まれていないと思います。誰かがこれをどのように解決できるか知っていますか?
5 に答える
cpu_t
他の3つに含まれている独自のヘッダーファイルで宣言しますtypes.h
か?
循環インクルードは、コードの保守とデバッグの邪魔になる可能性があります。cpu.hを2つのファイルに分割することをお勧めします。1つはregister.hとaddrmode.hが含まれ、もう1つはこれら2つのファイルが含まれます。
register.hとaddrmode.hを配置して、構造体の定義が不要になるようにするか、構造体の宣言を独自のヘッダーに移動します。
cpuの定義は必要ないことに注意してください。
struct cpuのtypedefを定義するには:
typedef struct cpu cpu_type;
structcpuへの変数または型ポインターのメンバーを定義するには:
struct cpu * ptr;
タイプstructcpuの外部変数を宣言するには:
extern struct cpy myCpu;
struct cpu引数を取る関数を宣言するには:
void foo(struct cpu p);
したがって、その定義を提供することを目的としないヘッダーで構造の定義が必要になる主な理由は次のとおりです。
タイプstructcpuのメンバーを持つ構造体をヘッダーで定義します。
struct intelcpu {struct cpu base; };
メンバーにアクセスする必要がある、またはそのタイプのローカル変数を持つインライン関数を定義します
他の2つのヘッダーを含める前に、cpu.hでstruct cpu_tを定義できますか?
実際、私はOrenTrutnerの答えの方が好きです。私の答えははるかに壊れやすいです---あなたは本当に相互再帰的なヘッダーファイルを望んでいません。
あなたは「何も含まれていない」と述べましたが、それは他の観察に基づく控除です。どのようなエラーメッセージが表示されていますか?もっと情報が必要だと思います。