允许我的 C++与 C 一起使用的库(减少的函数集)
我一直想构建一个共享库,其中将利用类来保持其功能干净(它可能需要许多输入或处理),尽管我仍然希望针对 C 平台。
如果我在所有原型上应用 extern "C" {} ,并在示例中提供一组模仿类函数的公开函数,以便对象不需要“需要”使用我的库,那么这些普通函数是否可以在 C 程序中工作会链接到它吗?
I've been wanting to build a shared library of which will utilize classes to keep its functioning clean (it may require many inputs or processing), although I still wish to target for C platforms.
If I apply extern "C" {} over all my prototypes, and provide in example a set of exposed functions that mimick the class functions so that objects are not "required" to use my library, will those normal functions work in C programs that will link to it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
您可能需要为 C 源代码包含单独的头文件。 C 标头不应包含 C 编译器可能需要解析的任何 C++ 代码。在那里,您将向 C++ 库提供 C 接口。通过向此标头中的函数声明提供 extern "C"
修饰符(正如您所指示的那样),您可以告诉编译器使链接适用于 C 程序。
因此,如果您需要 C 程序保存对对象的引用,只需将其作为 void *
指针通过 C 接口来回传递即可。在 C 语言中,你只需将其视为一块神奇的饼干。
其他帖子谈到通过 DLL 公开接口,这也是有用的知识,但严格来说并不涉及(标准)语言方面。
编辑
哎呀。 extern "C"
部分是 C++ 语法。因此,在 C++ 端,您必须使用 extern "C"
声明 C 接口函数,但在 C 端,您不能使用该语法。您可以通过常见的习惯用法来实现这一点:
#ifdef __cplusplus
extern "C" {
#endif
void foo();
#ifdef __cplusplus
}
#endif
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如果您以您所描述的方式创建一个 dll,即所有接口都是 extern“C”并且接口中的所有类型都是 POD,那么是的,您在 C 或 .NET 中使用它实际上不会有任何问题
示例:
If you create a dll in the fasion you described, that is, all interfaces are extern "C" and all types in interfaces are POD's then yes, you'll practically have no problem using it in C or .NET
Example: