编译错误,"uses undefined struct"

Compilation error, "uses undefined struct"

本文关键字:undefined struct uses 编译 错误      更新时间:2023-10-16

我想向前声明结构体的各个部分,因此首先显示"package"结构体。我得到了"使用未定义结构体"的错误,其中"头"在"包"中声明。当然编译器(VS2010)会扫描头文件的定义之前抛出这个错误?

struct Header;
struct Package
{
    Header header;             <-- "uses undefined struct"
};
struct Header
{
    uint32_t Signature;
    uint8_t MajorVersion;
    uint8_t MinorVersion;
};

谢谢

我得到一个错误的"使用未定义的结构",其中"头"在"包"中声明。

不能声明不完整类型的成员,因为编译器不知道它有多大,以及应该为它保留多少空间(以及其他事项)。

编译器(VS2010)肯定会在抛出此错误之前扫描头文件的定义?

不,你为什么那么想?

在完全声明该类型之前不能使用该类型,因为诸如大小等信息需要事先知道。但是,您可以创建指向这些类型的指针,因为它们不需要这些信息。


有两种方法可以解决这个问题。一个是作弊的,一个是"正当的"。

第一个是作弊的。可以对结构体进行原型化,但是,在声明结构体之前,只能将其用作指针。因此,在声明Header之前,不能将其用作值类型。因此,不可靠的方法是将Header header;替换为Header *header;,然后在运行时分配内存。

然而,有一种好得多的方法。

您可以将此单个文件拆分为多个文件,即:header.hpppackage.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

当编译器还不知道Header到底是什么时,你不能让Package包含Header类型的东西。你只能有指向Header的指针

你可以使用指针:

struct Package
{
    struct Header *header;
};
struct Header
{
    uint32_t Signature;
    uint8_t MajorVersion;
    uint8_t MinorVersion;
};
相关文章: