对于大学的项目,我需要扩展现有的C应用程序,该应用程序最终将运行在各种商业和非商业unix系统(FreeBSD,Solaris,AIX等)上。
当我想编写一个最便携的C程序时,我需要考虑哪些事项?
答案 0 :(得分:22)
我能给出的最好建议是每天搬到不同的平台,随时进行测试 这将使平台差异像拇指一样突出,并同时教你可移植性问题。
保存跨平台测试结束,将导致失败。
除此之外
通常最好将编译器警告级别设置为尽可能高, 看到编译器可以抱怨的各种事情。
答案 1 :(得分:7)
我曾经编写C实用程序,然后我会支持16位到64位架构,包括一些60位机器。它们包括至少三种“字节序”,不同的浮点格式,不同的字符编码和不同的操作系统(尽管Unix占主导地位)。
有了这些,如果你避免多次写东西和#ifdef代码的主要部分的诱惑,你会发现跨不同平台的编码和测试有助于更快地发现错误。你最终会制作出更有纪律,可理解,可维护的程序。
答案 2 :(得分:4)
答案 3 :(得分:4)
您可能需要及时了解的一个特定问题(例如,如果您的数据文件可以跨平台工作)endianness。
在不同体系结构的二进制级别上,数字的表示方式不同。 Big-endian系统首先排序最重要的字节,而little-endian系统首先排序最不重要的字节。
如果以一个字节顺序将一些原始数据写入文件,然后在具有不同字节顺序的系统上读回该文件,则显然会出现问题。
您应该能够在sys/param.h
的大多数系统上在编译时获得字节序。如果需要在运行时检测它,一种方法是使用int
和char
的并集,然后将char
设置为1并查看{{1}的值} has。
答案 4 :(得分:2)
这是一个很长的清单。最好的办法是阅读例子。例如source of perl。如果你看一下perl的来源,你会看到一个巨大的构建头文件的过程,它处理大约50个平台问题。
读它并哭泣或借用。
答案 5 :(得分:1)
列表可能很长,但它并不像支持Windows和MSDOS那么长。这对许多公用事业来说很常见。
通常的技术是将核心算法模块与处理操作系统的模块分开 - 基本上是分层抽象的策略。
相比之下,在几种unix之间进行区分是相当简单的。坚持使用所有使用相同RTL名称的功能,或者查看支持的平台的多数约定以及例外中的#ifdef
。
答案 6 :(得分:1)
对于您使用的任何库函数,请继续参考POSIX标准。标准的某些部分是模糊的,一些系统返回不同类型的错误代码。这将帮助您主动找到那些真正难以找到稍微不同的实现错误。