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

Shi*_*ava 4 c++ linux posix linux-device-driver linux-kernel

我是Linux系统编程领域的新手.我目前在C语言中编程并希望切换到c ++.

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

zwo*_*wol 6

原则上,您应该能够使用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库之上矮人风格的异常处理?),但这样的fork,setcontext和朋友pthread_cancel,pthread_cleanup_push和可能其他一些我不记得了顶我的头.(我记得在2004年左右,Ulrich Drepper和GCC C++家伙之间存在一个巨大的,最终没有结论的论点,关于pthread_cancel在析构函数存在的情况下究竟应该如何表现.)

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

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

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

  • @SamProtsenko这就是我所说的"巧妙地使用一些C++关键字作为声明名称". (2认同)