サイズなどの情報が事前にわかっている必要があるため、完全に宣言されるまで型を使用することはできません。ただし、これらの型はこの情報を必要としないため、これらの型へのポインターを作成することはできます。
これを解決するには 2 つの方法があります。チートなものと「適切な」もの。
最初にチートなもの。構造体のプロトタイプを作成することはできますが、宣言するまで構造体をポインターとしてしか使用できません。Header
したがって、宣言される前に値型として使用することはできません。したがって、不正な方法は、実行時にメモリを置き換えHeader header;
て割り当てることです。Header *header;
ただし、はるかに優れた方法があります。
この単一のファイルを複数のファイル、つまりheader.hpp
とに分割package.hpp
し、それらに相互を含めることができます。ただし、これを行う際に 1 つの問題があります。ヘッダーが相互に再帰的にインクルードする (または同じヘッダーを複数回インクルードする) 場合、型は何度も再定義されます。タイプを一度だけ定義する方法が必要です。これは、ヘッダーが使用されるたびに、「包含ガード」で囲むことによって行われます。次のようになります。
#ifndef HEADER_HPP
#define HEADER_HPP
// Header code here
#endif /* HEADER_HPP */
そうすれば、それらは 1 回だけ宣言されますが、両方のファイルで両方の型を使用できます。
したがって、package.hpp
ファイルは次のようになります。
#ifndef PACKAGE_HPP
#define PACKAGE_HPP
#include "header.hpp"
struct Package {
Header header;
};
#endif
そして、あなたのheader.hpp
意志は次のようになります:
#ifndef HEADER_HPP
#define HEADER_HPP
struct Header {
uint32_t Signature;
uint8_t MajorVersion;
uint8_t MinorVersion;
};
#endif