c++ - 结合C\C++转换单元的状态?

标签 c++ c gcc

我有一个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恶意代码。

关于c++ - 结合C\C++转换单元的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63702594/

相关文章:

c++ - OpenCV加速Mat迭代

c++ - 0x0 @ 0x196f2f0 是什么意思?

c - 如何使用 JNI 从 C 中的 jobject 获取值?

gcc - ar/nm 和 gcc-ar/gcc-nm 有什么区别?

c - 错误 : dereferencing pointer to incomplete type - Why?

c++ - 带堆指针的复制构造函数

c++ - 返回指向局部变量的指针?? (警告 C4172)

c - X11:如何正确支持每像素 16 位显示

不使用任何运算符检查数字是偶数还是奇数

python - Cython 导入工作一次 - 然后给出 gcc.bat 错误