我们可以在 c++ 中使用 POSIX C 库吗?

Can we use the POSIX C libraries in c++?

本文关键字:POSIX 库吗 c++ 我们      更新时间:2023-10-16

我是Linux系统编程领域的新手。我目前用 C 编程,想切换到 c++。

我们可以在 c++ 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗?

原则上,你应该能够使用C++中的任何C API;该语言包括促进它的功能,大多数C库作者都知道人们想要这样做,并会采取适当的步骤。 对于 POSIX 指定的系统编程接口,C++兼容性是一个明确的设计目标。

但是,您可能仍会遇到问题。 根据我的经验,最常见的问题是:

  1. C API 标头通常会将数百个符号转储到全局命名空间中。 其中一些符号可能与C++库符号冲突,如果您using namespace std,这会给您带来麻烦(但您没有这样做,对吧?
  2. C API 标头经常大量使用宏,包括宏名称,是的,可能与C++库符号冲突;std::不会在那里救你。
  3. 以严格的一致性模式编译程序(例如-std=c++11 -D_XOPEN_SOURCE=700) 可能会暴露系统标头中的错误。 这更有可能发生在C++而不是 C 上。
  4. 一小部分 POSIX API 具有异常的控制流行为,可能与异常和析构函数交互不良C++具体取决于 C 库实现器在避免问题方面的彻底程度。setjmplongjmp显然是一个问题(有没有人做过一个C库来实现DWARF风格的异常处理?),但forksetcontext和朋友,pthread_cancelpthread_cleanup_push,可能还有其他一些我不记得的。 (我记得在2004年左右,Ulrich Drepper和GCC C++人员之间关于pthread_cancel在析构函数面前应该如何表现的争论,最终没有定论。

如果您超越 POSIX,您可能还会遇到以下问题:

  1. 编译为 C++ 时,不会费心将所有声明包装在extern "C"块中的标头,这意味着所有函数名称在不应该被破坏时都会被破坏,并且链接失败。
  2. 甚至懒得坚持 C 和 C++ 的交集的标头。 在最坏的情况下,这可能会导致在程序运行之前不会出现的故障。 最常见的例子是:
    • 轻率地使用一些C++关键字作为声明的名称(例如int template;)
    • 假设void *赋值与其他指针类型兼容(例如,不需要强制转换malloc的结果)
    • 假设struct foo;没有定义 typedef-namefoo

请注意,POSIX 指定的标头经常包含特定于系统的扩展,这些扩展不像 POSIX 接口本身那样经过仔细考虑。

"我们可以在 c++ 中使用 POSIX C 库中定义的所有函数而不做任何更改吗?">

当然可以。任何 C 样式的 API 都可以在 C++ 中无缝使用。