在完全声明之前,您不能使用该类型,因为需要事先知道大小等信息。但是,您可以创建指向这些类型的指针,因为它们不需要此信息。
有两种方法可以解决这个问题。一个骗子和一个“适当的”。
首先是骗子。您可以对结构进行原型设计,但是,在声明它之前,您只能将结构用作指针。Header
因此,在声明之前,您不能将其用作值类型。所以欺骗的方式是在运行时替换Header header;
然后Header *header;
分配内存。
然而,还有一种更好的方法。
您可以将此单个文件拆分为多个文件,即:header.hpp
和package.hpp
,并让它们相互包含。但是,这样做时有一个问题。当标头递归地相互包含时(或者您多次包含相同的标头),类型将一遍又一遍地重新定义。您需要一种只定义一次类型的方法。几乎每次使用标头时都会这样做,方法是用“包含防护”将其括起来。它看起来像这样:
#ifndef HEADER_HPP
#define HEADER_HPP
// Header code here
#endif /* HEADER_HPP */
这样,它们只会被声明一次,但您可以在两个文件中使用这两种类型。
因此,您的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