C ++是否弃用Linux API的某些部分?

我正在阅读Linux编程接口Linux编程的例子 。 这两本书都非常好,很好的解释了Linux API。 但是我经常发现自己认为,在现实世界的项目中,我更喜欢C ++标准库,Boost或其他一些优秀的C ++库(有许多写得很好的,可移植的C ++库),只要有可能的话。 这自然会提出一个问题 – 当目标平台上有良好的C ++编译器和库(Boost,TBB等)时,为什么我需要直接使用Linux API? 我猜也可以说Windows API,但我不太了解Windows系统编程。

这对C ++来说并不陌生。 在C中,有很长的两种打开文件的方法:

// Only on POSIX int fdes = open("file.txt", O_RDONLY); 

要么:

 // Any hosted C environment, POSIX or otherwise FILE *fp = fopen("file.txt", "rb"); 

那么为什么有人会使用POSIX特定的版本呢? 答案很简单 – 有大量的系统调用与POSIX文件描述符一起工作。 例如, select 。 你也可以做非文件的东西,比如管道和套接字,你可以把它们传递给其他进程。 使用POSIX文件描述符有着悠久的传统,我们有大量关于如何使用它们进行网络编程的书籍和参考资料。

所以在便携版本和强大版本之间进行权衡。 它一直是。

另外一半是在Linux上使用POSIX界面的文件。 图书馆只是把你藏起来。 Boost使用它,C运行时使用它,JRE使用它,而GHC使用它。 许多(大多数?)语言运行时用C编写,并且首选直接访问系统调用。

您应该尽可能使用更高级别的API。 使用它通常会更快,并且更容易将代码移植到另一个平台。 然而:

  1. 由于漏洞抽象的规律,了解解除操作系统API是非常有用的,因此您可以了解更高层API无法隐藏的各种怪癖和性能问题。
  2. 有些东西不适用于便携式API,通常是因为它在操作系统之间如此不同以至于不太可能。
  3. 所有的便携式API都会产生一些开销。 在一个大型项目中,与其他代码相比,它是很小的,但是如果你做的很小,你可能想要避免这种开销,特别是如果你知道你需要在某个地方使用特定的API。

C ++标准不是针对特定平台发布的。 它是平台独立的,所以如果你打算使用一些平台特性/功能,你将不得不使用平台相关的特性/功能,通常称为system API。 所以在这个意义上,没有C + +库不会弃用Linux / Windows API。