sca*_*ace 3 c linux windows operating-system
我需要你解释一下我如何知道我的C程序是否可以在Windows上运行,如果我在Linux上编写它并且它在Linux上工作,反之亦然(用Windows编写的程序)
还有什么标准可以编写将在不同操作系统上运行的程序?如何检测库或整个库中的函数是否可以在不同的操作系统上运行?
比如我有功能fread,fwrite,fopen,fclose从图书馆stdio.h-我怎么知道,如果我能与他们正常的其它系统比Linux工作?同样的,与文件描述符工作职能:open,creat,close,read,write从图书馆:sys/types.h,sys/stat.h,fcntl.h.
小智 10
嗯,这很简单:只要它只使用两件事,你的程序就可以在Windows上运行:
C标准库,如C标准中所述.参见例如n1570.pdf,这是与实际标准非常接近的最新草案版本.请注意,许多C标准库都带有各种扩展,当然你不能使用它们.如果有疑问,请使用-std=c11选项(gcc或clang)进行编译,该选项应隐藏扩展的所有声明.
这里还有一个陷阱:微软对C标准的实施并不完整.这取决于你的编译器实际上链接了哪个C标准库,如果是MinGW,它msvcrt.dll只是符合C89 的旧版本,所以你可能想要读取旧标准而不是你可以使用哪些函数,例如这里是对C89中的标准库使用Microsoft的C编译器,您可以在标准库中获得不同级别的C99支持(它们链接自己的运行时DLL),具体取决于版本.
第三方库,可用于Windows,例如像SDL,GTK+等等.
通过使用open,creat,close,read,write等,您使用的是POSIX指定的扩展名.一些POSIX功能在Windows上可用,一些略有不同,有些只是缺失.如果您希望保持Windows的可移植性,最好不要使用它们.此规则的例外情况是,如果您计划使用Cygwin编译代码,Cygwin是Windows的完整POSIX兼容层.
按照IanAbbott的评论,这也是至关重要的使用整数类型正确,而不是暗含的假设,比如像" 一个long拥有64位 "或" 一个int可以容纳一个指针 ",这是错误的一般情况.始终使用<stdint.h>固定宽度类型,uintptr_t指针值,size_t对象大小等类型.
虽然与您的问题没有直接关系:对于大多数非平凡的程序,您迟早需要使用某些特定于平台的功能.通常,有些库会抽象出来,例如,如果你需要有效地处理I/O事件,而不是epoll在Linux上,kqueue在FreeBSD上,IO completion ports在Windows上使用,你可以使用libevent.但是如果你没有找到这样的库,这里有一个提示:
明确地将特定于平台的代码分离到其自己的模块(翻译单元)中.这样,将整个东西移植到不同平台的工作变得非常小.