我正在考虑为跨平台编译C,并且已经弄清楚了。现在,我想知道您是否需要特定于windows/mac/linux的库,还是stdio (glibc)是一个跨平台库,将所有低级别的系统抽象成一个很好的标准API。不知道它是不是这么做的。例如,文件系统的东西,似乎是跨平台的。但也许网络连接的东西不是,不确定。而且,我看到了很多这里的#ifdef _WIN32,尽管它只是stdio上的一个简单的文件系统包装器,所以不确定stdio是否没有涵盖所有内容。
环顾四周,我看到一些“跨平台”库(如利布夫 )有特定于windows和unix的代码,因此不确定是否需要连接到“本机”(os特定的)功能,以及通常需要这样做的时间/地方。
首先,想知道glibc / stdio是否是围绕syscall和其他常见函数的跨平台抽象。然后想知道当您需要编写特定于平台的功能时,是否可以简单地解释/概述,以及在此基础上是否没有标准的库/抽象。
发布于 2018-08-07 11:03:33
stdio.h是C11标准的一部分(参见n1570;您确实应该下载并阅读该标准)。如果限制自己只使用该标准描述的函数(按照标准指定的方式),如果使用符合标准的实现(例如编译器和C标准库实现),则应该是安全的。
但是,许多特性(例如目录、符号链接、文件截断)都超出了C11标准。您可能对POSIX标准感兴趣。
插座不是C11标准的一部分(但主要是POSIX,参见这)。
一些库(例如滑翔)试图为几个OSes定义公共抽象。如果您想要轻松地编写在几个常见平台上可编译的源代码,您可能会考虑这些。(使用C++,您还可以使用波科、助推、Qt、.)
顺便说一下,Linux手册页(从介绍(2) &介绍(3)开始.)经常提到大多数功能所遵循的标准。例如,查城(2)是在POSIX1.2008中定义的。
还请注意,标准是规范,可能没有完全遵循或遵守(甚至在标准中也是bug)。例如,C11 线程 (例如thrd_create)可能无法在某些(仍在使用的) 滑翔版本中使用(因为它的线程(7)早于C11)。另外,一些库实现的标准函数超出了标准要求(例如,在Linux上,fopen(3)在模式字符串中理解m )。
记住这句格言:没有可移植的代码,只有已经移植(到某些特定系统)的代码。另见这。
https://stackoverflow.com/questions/51725131
复制相似问题