我有一个main.c文件,其中包括一个 protected (#ifndef ...)c头文件,称为mydefinitions.h。
在 header 中,我声明了一个extern函数,将其命名为CppMain,然后从main.c文件中对其进行调用。
CppMain函数在cppmain.cpp文件中定义,该文件包含( protected )mydefinitions.h文件作为外部“C”头。
我遇到的问题是,在mydefinitions.h文件中声明并定义的某个函数INIT_Pfn被多次定义(编译器认为该方法有多个定义)。
据我了解,由于上述extern CppMain函数的定义,编译器正在处理cppmain.cpp,但由于mydefinitions.h不在main.c的范围内,因此要重新处理mydefinitions.h,因此保护(#ifndef ...)是重新初始化-对我来说,这是完全合理的。
问题的主要要点是,我试图在C++中实现一些逻辑,而不是在C中做到这一点,但是要保持main.c程序转换的全局作用域\状态。
有什么方法可以避免从mydefinitions.h文件中取出INIT_Pfn?您可能会想到实现该解决方案而不影响mydefinitions.h的其他方式吗?
该文件还定义了一个全局变量,该变量在整个源中都具有依赖性...
编辑(添加了代码段):
mydefinitions.h:
#ifndef MyDefinitions
#define MyDefinitions
unsigned int GLOBAL_STATE = 0;
extern void CppMain();
#endif // !MyDefinitions
MyCPPFile.cpp:#ifndef MyCPPFile
#define MyCPPFile
extern "C" {
#include "mydefinitions.h"
}
extern "C" void CppMain()
{
// cpp code here
}
#endif // !MyCPPFile
main.c文件:#include "mydefinitions.h"
int main(int argc, char *argv[])
{
CppMain();
}
最佳答案
发生的事情是,从源编译的每个目标文件都包含整数GLOBAL_STATE
以及它的运行时初始化程序。您只需要定义一次即可。
在头文件中,声明变量extern
:
extern unsigned int GLOBAL_STATE;
在主C文件中,定义它:unsigned int GLOBAL_STATE = 0;
您不需要CPP文件中的#define MyCPPFile
恶意代码。