繁体   English   中英

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

[英]Calling C++ function from C without using extern “C”

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

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

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

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

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

你可以调查一下

LoadLibrary("path to dll");

加载DLL和

GetProcAddress("?f@@YAXXZ");

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM