从C调用C ++函数而不使用extern“C”

时间:2014-01-04 13:10:46

标签: c++ c visual-studio name-mangling

是否可以从C代码调用C ++ DLL中的函数? 该函数未声明为extern "C"。 一个丑陋的平台依赖黑客只适用于Visual Studio很好。

调用约定不应该是一个主要问题,但我如何处理名称修改。 例如,对于Visual Studio,带有签名void f()的C ++函数具有错位名称?f@@YAXXZ,并且不是合法的C标识符。

(你不需要告诉我,我应该将C ++函数声明为extern "C"。 我已经知道了。但我处于无法更改C ++代码的情况。)

5 个答案:

答案 0 :(得分:8)

在另一个C ++函数中包装冒犯函数,并用extern "C"声明它。无需为它创建特殊的DLL,只需在项目中包含一个C ++文件即可。

答案 1 :(得分:4)

要使编译器静态链接具有不同导出名称的函数可能会很棘手。但您始终可以使用LoadLibrary加载DLL,然后使用GetProcAddress

答案 2 :(得分:2)

您可以调查

LoadLibrary("path to dll");

加载DLL和

GetProcAddress("?f@@YAXXZ");

获取指向外部声明函数的函数指针。

答案 3 :(得分:1)

除了创建一个用C ++编写的额外dll并通过extern“C”公开所有接口之外,我没有看到任何干净的解决方案。

答案 4 :(得分:0)

您可以使用他们使用的相同C ++编译器编译您的C代码,然后您的C函数将使用相同的机制进行损坏,一切都将无缝链接,没有人会注意到任何差异。

如果必须使用其他编译器,则必须使用LoadLibrary手动加载dll,并使用GetProcAddress手动加载每个函数。