编译错误,"uses undefined struct"
Compilation error, "uses undefined struct"
我想向前声明结构体的各个部分,因此首先显示"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.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
当编译器还不知道Header到底是什么时,你不能让Package包含Header类型的东西。你只能有指向Header的指针
你可以使用指针:
struct Package
{
struct Header *header;
};
struct Header
{
uint32_t Signature;
uint8_t MajorVersion;
uint8_t MinorVersion;
};
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- C++Union/Struct位域的实现和可移植性
- "Undefined class"作为is_base_of的论据
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 错误:"Left of getValue must have class/struct/union"
- 在 SVM-Struct 中未定义对 sqrt 的引用(已使用 -lm)
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- VSCode C/C++ Intellisense issue: Undefined identifiers (Linu
- 与卡特琳娜一起卷曲C++失败并得到"Undefined symbols for architecture x86_64"
- 获取"Use of undefined type"和"Must have class/struct/union"错误
- 前向声明不够时如何避免"'identifier' uses undefined class/struct/union 'name'"错误?
- 编译错误,"uses undefined struct"