结合 C\C++ 翻译单元状态?

Posted

技术标签:

【中文标题】结合 C\\C++ 翻译单元状态?【英文标题】:combining C\C++ translation units state?结合 C\C++ 翻译单元状态? 【发布时间】:2020-09-02 09:25:12 【问题描述】:

我有一个 main.c 文件,其中包含一个受保护的 (#ifndef...) c 标头,名为 mydefinitions.h。

在头文件中我声明了一个外部函数,我们称之为 CppMain,然后我从 main.c 文件中调用它。

CppMain 函数在 cppmain.cpp 文件中定义,该文件包含(受保护的)mydefinitions.h 文件作为外部“C”头文件。

我遇到的问题是,在 mydefinitions.h 文件中声明和定义的某个函数 INIT_Pfn 被多次定义(编译器认为该方法有多个定义)。

据我了解,编译器正在处理 cppmain.cpp 作为所述 extern CppMain 函数定义的结果,但重新处理 mydefinitions.h,因为它超出了 main.c 的范围,因此是保护 (#ifndef.. .) 正在重新初始化 - 对我来说,这是完全合理的。

这个问题的主要主旨是我试图在 C++ 中实现一些逻辑,而不是在 C 中做这一切,但要保持 main.c 程序翻译的全局范围\状态。

有什么方法可以避免从 mydefinitions.h 文件中取出 INIT_Pfn 吗?您可能会想到在不影响 mydefinitions.h 的情况下实施此解决方案的任何其他方式吗? 该文件还定义了一个全局变量,该变量在整个源代码中都具有依赖关系...

已编辑(添加代码 sn-ps):

我的定义.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();

【问题讨论】:

你能把这个作为代码示例吗?将其简化为仅显示您的问题的简洁示例。我们喜欢代码;)(但不想看到你所有的源代码——只是相关的部分!) 要么设为static,使其具有内部链接,要么设为inline 但是是的,正确使用extern "C" 将允许您从 C 代码调用过程 C++ 代码。 为什么要在标题中定义函数?除非他们是static inline,否则您根本不应该这样做。 感谢 cmets 伙计们,已经学到了一些东西(!),但是 - 有没有办法在不更改头文件的情况下做到这一点?还想补充一点,从标题中取出方法的定义是一个很好的提示,但我正在一个相当不稳定的环境中工作 【参考方案1】:

发生的情况是,从源代码编译的每个目标文件都包含整数 GLOBAL_STATE 以及它的运行时初始化程序。你只需要定义一次。

在头文件中,声明变量extern

extern unsigned int GLOBAL_STATE;

在你的主 C 文件中,定义它:

unsigned int GLOBAL_STATE = 0;

您不需要 CPP 文件中的 #define MyCPPFile malarky。

【讨论】:

最后我找到了相同的解决方案,cpp 文件也开始作为标题谢谢!【参考方案2】:

如果函数是用 C 和 C++ 的公共子集编写的,那么您可以将函数声明为静态内联并且它应该可以工作。

变量必须在别处定义或必须是静态的,因为 C 没有内联变量。

【讨论】:

以上是关于结合 C\C++ 翻译单元状态?的主要内容,如果未能解决你的问题,请参考以下文章

翻译时mRNA结合核糖体的哪里?

帮忙把部分简历翻译成英文,万分感谢,50分

静态、全局和多个翻译单元

PAT甲级(Dijkstra结合模拟)--Public Bike Management

翻译密码

extern 关键字和多个翻译单元的使用