【问题标题】:error C2027: use of undefined type, with multiple files错误 C2027:使用未定义类型,包含多个文件
【发布时间】:2015-10-22 15:58:54
【问题描述】:

我知道关于这个问题有多个问题,但在我的限制下没有一个提供解决方案。

我正在做一个项目,其中给出了具有特定 API 的头文件 mips_cpu.h。我打算在不更改头文件的情况下开发它的实现。此 API 包含在文件 mips_cpu.cpp 中声明的结构:

struct mips_cpu_impl; typedef struct mips_cpu_impl *mips_cpu_h;

然后我在mips_cpu.cpp 中将这个结构定义为:

struct mips_cpu_impl{
//Program Counter
uint32_t pc;
uint32_t pcN;

//General Purpose Registers
uint32_t GPReg[32];

//Special registers for MUL / DIV instructions
uint32_t LO;
uint32_t HI;
----- more code ---

};

在另一个文件mips_cpu_instruction.cpp 中使用此结构时会出现问题。当我有这个代码时:

mips_error ADDI(mips_cpu_h state, uint8_t rs, uint8_t rt, uint16_t imm){
uint64_t check = state->GPReg[rs] + imm;
uint32_t tmp = state->GPReg[rs] + imm;
          ...
     more code and appropriate return
}

state 然后报错:use of undefined type 'mips_cpu_imps'

在头文件中包含结构的声明可以解决问题,但我不应该更改头文件。头文件还包含警卫,我不完全理解但可能相关?

【问题讨论】:

  • 文件mips_cpu_instruction.cpp是你编码的吗?如果是这样,你为什么要使用mips_cpu_impl?你可能不需要。这肯定是一个pimpl
  • 结构定义不必在标题中。
  • @molbdnilo 你说得对,结构定义不必在标题中。但是,当在文件中使用类型时,它必须是可见的,即对该文件可见。 Struct Def.
  • @PaoloM 是的,但它需要使用给定的结构声明来模拟 MIPS cpu
  • 您使用哪种语言? C 还是 C++?

标签: c++ c undefined header-files include-guards


【解决方案1】:

问题在于文件mips_cpu_instruction.cpp 不知道任何关于struct mips_cpu_imps 的信息,因为它可能包含您无法触摸的.h 文件(mips_cpu.h),但肯定不是.cpp定义该结构的文件 (mips_cpu.cpp)。您可以将声明添加到mips_cpu_instruction.cpp,但是如果项目中有其他文件使用此结构,您就会遇到问题,因为您也必须在那里定义它,并且在链接时您会得到同一结构的多个声明。

最好的解决方案是将其添加到您无法修改的文件中,但由于您无法修改它,因此您需要一种解决方法。我将创建另一个.h 文件,使用include guards 来保护代码不被多次包含,然后我将安全地#include 这个新的.h 文件放在每个需要它的.cpp 文件的顶部。然后它会在任何地方被定义,并且只定义一次。

最后,这意味着要使用这些 API,您必须包含 2 个.h 文件:一个您不能触摸的文件,另一个是新文件。如果您不想每次都包含 2 个文件,您甚至可以决定在您的新文件中添加 #include mips_cpu.h,然后您只需要 #include 新文件,您几乎可以忘记您的不可修改文件。

【讨论】:

  • 谢谢!与@RussSchultz 评论中的答案相同,但解释得更好
【解决方案2】:

您的结构尚未完全定义。它的定义足以让人们使用这些功能,但不足以实现这些功能。我怀疑这是家庭作业,你的任务是实现这些功能,包括这个结构。

为了让您在不直接帮助您完成作业的情况下解决编程问题,请输入:

struct mips_cpu_impl
{
    unsigned GPReg[1];
};

在 mips_cpu_instruction.cpp 文件的顶部,您会看到这些编译器错误消失了。您需要正确调整数组的大小并添加建模 MIPS 内核所需的任何其他状态。

附言助教的存在是有原因的。

【讨论】:

  • 我已经做到了,我显然已经这样做了,我会更新问题以使其清楚,
  • 您可以将您的确切结构定义复制/粘贴到另一个文件中,或者(最好)将您的结构定义移动到类似“my_mips_internal.h”的位置,并将其包含在两个实现文件中以确保它们'始终处于锁定/步态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多