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

我在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 ++的交集。 在最坏的情况下,这可能会导致在程序运行之前无法显示的故障。 最常见的情况是:
    • Blithely使用一些C ++关键字作为声明名称(例如int template;
    • 假设void *赋值与其他指针类型兼容(例如,不需要使用malloc的结果)
    • 假设struct foo; 没有定义typedef-name foo

请注意,由POSIX指定的头文件通常包含特定于系统的扩展,这些扩展与POSIX接口本身一样没有仔细考虑过。

“我们可以在c ++中使用所有在POSIX C库中定义的函数吗?”

当然可以。 任何C风格的API都可以在c ++中无缝地使用。