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

标签 c++ linux linux-kernel posix linux-device-driver

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

我们能否在 C++ 中使用 POSIX C 库中定义的所有函数而无需任何更改?

最佳答案

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

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

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

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

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

请注意,POSIX 指定的 header 经常包含系统特定的扩展,这些扩展没有像 POSIX 接口(interface)本身那样经过仔细考虑。

关于c++ - 我们可以在 C++ 中使用 POSIX C 库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29952576/

相关文章:

c++ - 二维 std::array 上的初始化列表

c++ - 将字符串与变量连接起来并将其视为 C/C++ 中的宏

php - xdebug 设置 PHP 调试

regex - grep 可以删除上下文,但不能删除整行吗?

linux - 我可以在 Linux 上用完虚拟内存吗?

linux - 用于删除的 Dentry 缓存

运行 T 测试时的 Python 运行时错误

c++ - visual studio c++ 静态链接做什么

linux-kernel - 调试Linux内核预解压阶段

linux - 有没有一种方法/工具可以在 Linux 下列出标记为 "thin"的 TCP 连接?