繁体   English   中英

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

[英]If stdio is cross-platform C / standard library abstraction for C

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

环顾四周,我看到一些类似libuv的 “跨平台”库具有特定于Windows与unix的代码,因此不确定是否需要挂入“本机”(特定于操作系统的)功能以及何时/您通常需要这样做的地方。

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

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

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

套接字 不是 C11标准的一部分(但大多数是POSIX,请参见this )。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM