我如何知道在Linux上编写的C程序是否可以在其他地方使用

时间:2017-07-06 14:45:39

标签: c linux windows operating-system

我需要你解释一下我如何知道我的C程序是否可以在Windows上运行,如果我在Linux上编写它并且它适用于Linux,反之亦然(用Windows编写的程序)

另外,我必须遵循哪些标准来编写将在不同操作系统上运行的程序?如何检测库或整个库中的函数是否可以在不同的操作系统上运行?

例如,我有来自库fread的函数fwritefopenfclosestdio.h - 我怎么知道我是否可以正确使用它们在除Linux之外的其他系统上?与使用文件描述符的函数相同:来自库的opencreatclosereadwritesys/types.h,{{1 },sys/stat.h

1 个答案:

答案 0 :(得分:10)

嗯,这很简单:只要它只使用两件事,你的程序就可以在Windows上运行:

  • C标准库,如C标准中所述。参见例如n1570.pdf,与实际标准非常接近的最新草稿版本。请注意,许多C标准库都带有各种扩展,当然你不能使用这些。如有疑问,请编译,例如使用-std=c11选项(gccclang),该选项应隐藏所有扩展声明。

    这里还有一个陷阱:微软对C标准的实施并不完整。这取决于你的编译器实际链接了哪个C标准库,如果是MinGW,那么它只是符合C89的旧msvcrt.dll,所以可能想要阅读较旧的标准,而不是您可以使用的功能,例如here's a description of the standard library in C89使用Microsoft的C编译器,您可以在标准库中获得不同级别的C99支持(它们链接自己的运行时DLL),具体取决于版本。

  • 适用于Windows的第三方库,例如: SDLGTK+

使用opencreatclosereadwrite等,您正在使用POSIX中指定的扩展程序。一些POSIX功能在Windows上可用,一些略有不同,有些只是缺失。如果您希望保持Windows的可移植性,最好不要使用它们。此规则的例外情况是,您计划使用Cygwin编译代码,http://getbootstrap.com/css/#grid-media-queries是Windows的完整POSIX兼容层。

根据IanAbbott的评论,正确使用整数类型 也是至关重要的,而不是隐含地假设“ a long有64位”或“< em> int可以保存指针“,这在一般情况下是错误的。始终将<stdint.h>类型用于固定宽度,uintptr_t用于指针值,size_t用于对象大小,依此类推。

虽然与您的问题没有直接关系:对于大多数非平凡的程序,您迟早需要使用某些特定于平台的功能。通常情况下,有些图书馆将其抽象出来,例如如果你需要有效地处理I / O事件,而不是在Linux上使用epoll,在FreeBSD上使用kqueue,在Windows上使用IO completion ports等等,你可以使用libevent 。但是如果你找不到这样的图书馆,这里有一个提示:

明确地将特定于平台的代码分离到其自己的模块(翻译单元)中。这样,将整个东西移植到另一个平台的工作变得非常小。