将 C 组件集成到 C++ 中的最佳实践是什么?框架?

发布于 2024-10-27 04:27:50 字数 216 浏览 0 评论 0原文

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

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

  • Ah中的一组extern变量
  • Bh中的一组数据结构定义和函数原型
  • 其余的源代码是.c 文件实现 Bh 中定义的函数

What's the best practice for putting a C component into a C++ framework?

Our lab is building a C++ framework for our research. It uses some existing software as components. My job is to integrate software in C. The structure of the software is quite simple:

  • A set of extern variables in A.h
  • A set of data structures definitions and function prototypes in B.h.
  • The rest of the source code are .c files implementing the functions defined in B.h.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风蛊 2024-11-03 04:27:50

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

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

这只是我突然想到的东西。如果您展示具有代表性的函数示例,则更容易给出具体答案。

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

It's worth considering whether the style of client usage can usefully be improved using the additional features of C++. You can often trivially wrap C functions for a more C++-style experience. For example:

  • objects may be able to:
    • cleanly encapsulate data returned by some function calls that is then used as inputs to later calls, making its storage and usage more implicit
    • provide some guarantees about the correct sequencing of construction (initialisation), usage and destruction (clean-up)
  • namespaces can help group and disambiguate the identifiers
  • operator overloading can allow operations on types to be notated more like mathematical or logical expression, (e.g. x = a + b instead of x = add(a, b))
  • exceptions might reduce the number of places in the client code where error values have to be explicitly checked for and handled (useful if this error-related code is currently obfuscating the program logic)
  • if any of the functions implement generic functionality via void*s, then templates could be provided as a front end, automating the conversion to and from the void* type

This just off-the-top-of-my-head stuff... it's much easier to give concrete answers if you show a representative sample of the functions.

And of course, as you say you have the C source code, you can try compiling it with the C++ compiler, which would give you the option of avoiding "extern C" and a bit of the pollution of the global namespace, as well as adding much of the above not as wrappers but as tweaks to the existing code: may save you time and make maintainence easier.

探春 2024-11-03 04:27:50

用以下内容包装所有 C 头文件和源文件:

#ifdef __cplusplus
extern "C" {
#endif

//... rest of the file

#ifdef __cplusplus
}
#endif

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

有关如何从 C++ 访问 C 函数的详细介绍,请参见此处

Wrapping all the C header and source files with:

#ifdef __cplusplus
extern "C" {
#endif

//... rest of the file

#ifdef __cplusplus
}
#endif

This is compile and link properly in a c++ compiler. This is just an initial step. Depending on the implementation and how the functions are used in the C code, the c++ compiler may complain about few things. But try this as a your first step.

See here for a nice introduction on how to access C functions from C++.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文