如果stdio是跨平台C / C的标准库抽象

时间:2018-08-07 10:58:48

标签: c cross-platform

我正在为跨平台编译C,并且已经弄清楚了。现在,我想知道您是否需要特定于Windows / mac / linux的库,或者stdio(glibc)是一个跨平台的库,可以将所有低级syscall提取为一个不错的标准API。不确定是否正在这样做。例如,文件系统的东西似乎是跨平台的。但是也许不确定网络连接的东西。另外,尽管here只是#ifdef _WIN32上的一个简单的文件系统包装程序,但我看到libuv还是很多stdio,所以不确定stdio是否不会涵盖所有内容。

环顾四周,我看到一些{{3}}之类的“跨平台”库具有特定于Windows与unix的代码,因此不确定是否需要挂入“本机”(os-特定功能),以及您通常需要在何时何地执行此操作。

首先考虑glibc / stdio是围绕syscalls和其他常见功能的跨平台抽象。然后想知道是否可以在需要编写特定于平台的功能时简要解释/概述,以及在此之上是否没有标准的库/抽象。

1 个答案:

答案 0 :(得分:1)

stdio.hC11标准的一部分(请参见n1570;您确实应该下载并阅读该标准)。如果限制自己仅使用该标准描述的功能(按照标准指定的方式),并且使用符合标准的实现(例如,编译器和C标准库实现),则应该是安全的。

但是,许多功能(例如目录,符号链接,文件截断)在C11标准的外部中。您可能对POSIX标准感兴趣。

Sockets不是C11标准的一部分(但主要是POSIX,请参见this)。

某些库(例如Glib)尝试为多个OS定义通用抽象。如果您想轻松地编写可在几种常见平台上编译的源代码,则可以考虑这些。 (对于C ++,您还可以使用POCOBoostQt,...。)

顺便说一句,Linux手册页(以intro(2)intro(3) ...开头)经常提到大多数功能遵循的标准。例如,chown(2)是在POSIX.1-2008中定义的。

还请注意,标准是规范,可能不会完全遵循或遵守(即使在标准中,它们也是错误)。例如,C11 threads(例如thrd_create)在某些glibc版本(仍在使用)中可能不可用(因为它有早于C11的pthreads(7))。此外,某些库实现的标准功能超出了标准的要求(例如,在Linux上,fopen(3)在模式字符串中理解m)。

请记住格言:没有可移植的代码,只有已移植的代码(已移植到某些特定的系统)。另请参见this

相关问题