我需要你解释一下我如何知道我的C程序是否可以在Windows上运行,如果我在Linux上编写它并且它适用于Linux,反之亦然(用Windows编写的程序)
另外,我必须遵循哪些标准来编写将在不同操作系统上运行的程序?如何检测库或整个库中的函数是否可以在不同的操作系统上运行?
例如,我有来自库fread
的函数fwrite
,fopen
,fclose
,stdio.h
- 我怎么知道我是否可以正确使用它们在除Linux之外的其他系统上?与使用文件描述符的函数相同:来自库的open
,creat
,close
,read
,write
:sys/types.h
,{{1 },sys/stat.h
。
答案 0 :(得分:10)
嗯,这很简单:只要它只使用两件事,你的程序就可以在Windows上运行:
C标准库,如C标准中所述。参见例如n1570.pdf,与实际标准非常接近的最新草稿版本。请注意,许多C标准库都带有各种扩展,当然你不能使用这些。如有疑问,请编译,例如使用-std=c11
选项(gcc
或clang
),该选项应隐藏所有扩展声明。
这里还有一个陷阱:微软对C标准的实施并不完整。这取决于你的编译器实际链接了哪个C标准库,如果是MinGW
,那么它只是符合C89的旧msvcrt.dll
,所以可能想要阅读较旧的标准,而不是您可以使用的功能,例如here's a description of the standard library in C89使用Microsoft的C编译器,您可以在标准库中获得不同级别的C99支持(它们链接自己的运行时DLL),具体取决于版本。
适用于Windows的第三方库,例如: SDL
,GTK+
等
使用open
,creat
,close
,read
,write
等,您正在使用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
。但是如果你找不到这样的图书馆,这里有一个提示:
明确地将特定于平台的代码分离到其自己的模块(翻译单元)中。这样,将整个东西移植到另一个平台的工作变得非常小。