【问题标题】:What's the best practice for integrating C components into a C++ framework?将 C 组件集成到 C++ 框架中的最佳实践是什么?
【发布时间】:2011-03-29 02:15:16
【问题描述】:

将 C 组件放入 C++ 框架的最佳实践是什么?

我们的实验室正在为我们的研究构建一个 C++ 框架。它使用一些现有的软件作为组件。我的工作是用 C 语言集成软件。软件的结构很简单:

  • A.h 中的一组extern 变量
  • B.h. 中的一组数据结构定义和函数原型。
  • 其余的源代码是实现 B.h 中定义的功能的 .c 文件。

【问题讨论】:

    标签: c++ c design-patterns


    【解决方案1】:

    值得考虑使用 C++ 的附加功能是否可以有效地改进客户端使用方式。您通常可以简单地包装 C 函数以获得更多 C++ 风格的体验。例如:

    • 对象可能能够:
      • 干净地封装一些函数调用返回的数据,然后将其用作后续调用的输入,使其存储和使用更加隐含
      • 为构建(初始化)、使用和销毁(清理)的正确顺序提供一些保证
    • 命名空间有助于对标识符进行分组和消除歧义
    • 运算符重载可以让对类型的操作更像数学或逻辑表达式(例如x = a + b 而不是x = add(a, b)
    • 异常可能会减少客户端代码中必须显式检查和处理错误值的位置数量(如果此错误相关代码当前正在混淆程序逻辑,则很有用)
    • 如果任何函数通过 void*s 实现通用功能,则可以提供模板作为前端,自动与 void* 类型进行转换

    这只是我脑海中浮现的东西......如果你展示一个有代表性的函数示例,那么给出具体答案会容易得多。

    当然,正如你所说,你有 C 源代码,你可以尝试用 C++ 编译器编译它,这可以让你选择避免“extern C”和一些全局命名空间的污染,以及添加上述大部分内容,而不是作为包装,而是作为对现有代码的调整:可以节省您的时间并使维护更容易。

    【讨论】:

    • +1: cleanly encapsulate data returned by some function calls that is then used as inputs... 对于从 C++ 的角度来看实际上是“由内而外”建模的所有 C API 尤其如此,例如使用不透明的 HANDLE 或任何可以翻转的上下文一堂课。
    【解决方案2】:

    用以下代码包装所有 C 头文件和源文件:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //... rest of the file
    
    #ifdef __cplusplus
    }
    #endif
    

    这是在 c++ 编译器中正确编译和链接。这只是第一步。根据实现以及函数在 C 代码中的使用方式,c++ 编译器可能会抱怨一些事情。但请将此作为您的第一步。

    请参阅here,了解有关如何从 C++ 访问 C 函数的精彩介绍。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2013-07-05
      相关资源
      最近更新 更多