error C2027: 使用未定义的类型,有多个文件
error C2027: use of undefined type, with multiple files
我知道有很多关于这个问题的问题,但 none 在我的限制下提供了一个解决方案。
我正在做一个项目,其中给出了带有特定 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
然后给出错误:使用未定义的类型 'mips_cpu_imps'
在头文件中包含结构声明可以解决问题,但我不应该更改头文件。头文件也包含守卫,我不完全理解但可能相关?
您的结构未完全定义。它的定义足以让人们使用这些功能,但还不足以实现这些功能。我怀疑这是家庭作业,你的任务是实现这些功能,包括这个结构。
为了让您在不直接帮助您完成作业的情况下解决编程问题,请输入:
struct mips_cpu_impl
{
unsigned GPReg[1];
};
在 mips_cpu_instruction.cpp 文件的顶部,您会看到这些编译器错误消失了。您需要适当地调整数组的大小并添加您需要的任何其他状态事物来为 MIPS 内核建模。
p.s。 TA 的存在是有原因的。
问题是文件 mips_cpu_instruction.cpp
对 struct mips_cpu_imps
一无所知,因为它可能包含您无法触摸的 .h
文件(mips_cpu.h
),但肯定不是定义该结构的 .cpp
文件 (mips_cpu.cpp
)。您可以将声明添加到 mips_cpu_instruction.cpp
,但是如果项目中有其他文件使用此结构,您就会遇到问题,因为您也必须在那里定义它,并且在链接时d 获取同一结构的多个声明。
最好的解决办法是将它添加到您无法修改的文件中,但由于您无法修改它,因此您需要一个解决方法。我会创建另一个 .h
文件,使用 include guards 来保护代码免受多重包含,然后我会安全地 #include
这个新的 .h
文件在每个 .cpp
需要它的文件。然后它会在任何地方定义,而且只定义一次。
最后,这意味着要使用这些 API,您必须包含 2 个 .h
文件:一个您不能触摸的文件和一个新文件。如果你不想每次都包含 2 个文件,你甚至可以决定 #include mips_cpu.h
在你的新文件中,然后你只需要 #include
新文件,你几乎可以忘记你不可修改的文件。
我知道有很多关于这个问题的问题,但 none 在我的限制下提供了一个解决方案。
我正在做一个项目,其中给出了带有特定 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
然后给出错误:使用未定义的类型 'mips_cpu_imps'
在头文件中包含结构声明可以解决问题,但我不应该更改头文件。头文件也包含守卫,我不完全理解但可能相关?
您的结构未完全定义。它的定义足以让人们使用这些功能,但还不足以实现这些功能。我怀疑这是家庭作业,你的任务是实现这些功能,包括这个结构。
为了让您在不直接帮助您完成作业的情况下解决编程问题,请输入:
struct mips_cpu_impl
{
unsigned GPReg[1];
};
在 mips_cpu_instruction.cpp 文件的顶部,您会看到这些编译器错误消失了。您需要适当地调整数组的大小并添加您需要的任何其他状态事物来为 MIPS 内核建模。
p.s。 TA 的存在是有原因的。
问题是文件 mips_cpu_instruction.cpp
对 struct mips_cpu_imps
一无所知,因为它可能包含您无法触摸的 .h
文件(mips_cpu.h
),但肯定不是定义该结构的 .cpp
文件 (mips_cpu.cpp
)。您可以将声明添加到 mips_cpu_instruction.cpp
,但是如果项目中有其他文件使用此结构,您就会遇到问题,因为您也必须在那里定义它,并且在链接时d 获取同一结构的多个声明。
最好的解决办法是将它添加到您无法修改的文件中,但由于您无法修改它,因此您需要一个解决方法。我会创建另一个 .h
文件,使用 include guards 来保护代码免受多重包含,然后我会安全地 #include
这个新的 .h
文件在每个 .cpp
需要它的文件。然后它会在任何地方定义,而且只定义一次。
最后,这意味着要使用这些 API,您必须包含 2 个 .h
文件:一个您不能触摸的文件和一个新文件。如果你不想每次都包含 2 个文件,你甚至可以决定 #include mips_cpu.h
在你的新文件中,然后你只需要 #include
新文件,你几乎可以忘记你不可修改的文件。