我知道这个问题有很多问题,但没有一个在我的约束下提供解决方案。
我正在开发一个项目,其中包含具有特定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'
在头文件中包含结构声明解决了问题,但我不应该更改头文件。头文件还包含警卫,我不完全理解,但可能是相关的?
答案 0 :(得分:1)
问题是文件mips_cpu_instruction.cpp
对struct 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存在是有原因的。