gpt4 book ai didi

c++ - 包装 C 或 C++ 库的优点和缺点是什么

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:35 24 4
gpt4 key购买 nike

我正在编写一些库,我希望它们在 C 和 C++ 中可用,然后用 swig 包装它们,使它们可用于 Ruby、Python、Java、Lisp ......

用 C 编写一个库然后用 C++ 包装库而不是用 C++ 编写然后用 C 包装它的优点和缺点是什么?

我唯一能想到的是,如果库是用 C++ 编写的,那么 C 程序可能需要 C++ 编译器来编译,尽管我可能不正确

可能还有一些不包装的功能或东西。

我主要是求经验,知道自己在做这个项目的过程中可能会遇到什么。

最佳答案

用C写,用C++包装:

优势

  • 如果您的 C 代码在某种程度上是面向对象的,或者根本不执行任何宏和类似技巧,那么制作 C++ 包装器应该很容易
  • 实际上,您可以使用 SWIG 或类似工具制作 C++ 包装器,然后使用相同的工件(如 SWIG 接口(interface)文件)制作其他(Ruby、Python...)包装器
  • 如果您对要连接的语言有想法(例如,Ruby 和 Python,但不是 Lisp 或其他语言),那么您可以以一种更容易为这些语言编写包装器的方式编写 C++ 包装器(即使没有 SWIG)

缺点

  • 人们可能会在制作 C++ 包装器时陷入困境,该包装器过于 C++ 风格(例如,模板太多),这可能很难用另一种语言包装
  • 只有少数语言支持直接连接 C++,尤其是整个 C++。因此,您几乎需要为其他语言编写包装器。

用C++写,用C包裹:

优势

  • C 是一种更易于交互的语言,因为它是一种更简单的语言,而且大多数环境/操作系统都是用 C 编写的。

  • 实际上,如果您遵循一些约定(“ABI”),大多数语言都提供了一种调用 C DLL/.so 的方法,根本不需要任何包装器。在大多数情况下,它很丑陋,但可以很好地用于更简单的界面、原型(prototype)等。

缺点

  • 与 C 接口(interface)并不像馅饼那样“简单”,因此如果您不小心可能会遇到麻烦。例如,在 Windows 上,要从 DLL 中导出函数,您必须将其标记为“已导出”,这只是“事实上”的标准做法。还有结构对齐、枚举大小和其他问题。

  • 从 C 连接到 C++ 比从 C 连接到 C++ 更难,反之亦然。你必须确保你的异常不会从 C++ 传播,正确地“翻译”C++ 模板(记住 std::string 是一个模板),各种继承习语(接口(interface),混合,“常规”多重继承...... ) 在界面中...

我的建议

这两种方法我都做过,根据我的经验,您应该使用更适合您手头任务的语言来编写模块。完成后,连接到另一个,然后包装到所有其余部分。实际上,没有人会阻止您从一种语言(例如 Ruby)包装 C 接口(interface)和从另一种语言(例如 Python - 使用 Cython)包装 C++。

C 和 C++ 之间的接口(interface)比它们中的任何一种与(几乎所有)其他语言的接口(interface)要容易得多,因此在决定主要开发语言时不应产生非常重大的影响。

关于c++ - 包装 C 或 C++ 库的优点和缺点是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26658744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com