错误C2027:使用未定义类型,包含多个文件

时间:2015-10-22 15:58:54

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

我知道这个问题有很多问题,但没有一个在我的约束下提供解决方案。

我正在开发一个项目,其中包含具有特定API的头文件mips_cpu.cpp。我打算在不改变头文件的情况下开发它的实现。此API包含在文件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

CoreDataStore然后给出错误:使用未定义类型'mips_cpu_imps'

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

2 个答案:

答案 0 :(得分:1)

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

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

最后,这意味着要使用这些API,您必须包含2个.h文件:您无法触摸的文件和新文件。如果您不希望每次都包含2个文件,您甚至可以在新文件中决定.cpp,然后您只需要.h新文件,并且你几乎可以忘记你的不可修改的档案。

答案 1 :(得分:0)

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

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

struct mips_cpu_impl
{
    unsigned GPReg[1];
};

位于mips_cpu_instruction.cpp文件的顶部,您将看到这些编译器错误消失。您需要正确调整阵列的大小,并添加模拟MIPS核心所需的任何其他状态。

P.S。 TA存在是有原因的。