【发布时间】:2010-02-20 20:06:23
【问题描述】:
对于大学的一个项目,我需要扩展一个现有的 C 应用程序,该应用程序最终将在各种商业和非商业 unix 系统(FreeBSD、Solaris、AIX 等)上运行。
当我想编写一个最便携的 C 程序时,我必须考虑哪些事情?
【问题讨论】:
标签: c portability
对于大学的一个项目,我需要扩展一个现有的 C 应用程序,该应用程序最终将在各种商业和非商业 unix 系统(FreeBSD、Solaris、AIX 等)上运行。
当我想编写一个最便携的 C 程序时,我必须考虑哪些事情?
【问题讨论】:
标签: c portability
我能给出的最佳建议是每天转移到不同的平台,随时进行测试。
这将使平台差异变得像大拇指一样突出,同时教会你可移植性问题。
把跨平台测试留到最后,会导致失败。
除此之外
通常最好将编译器警告级别设置得尽可能高, 查看编译器可以抱怨的各种事情。
【讨论】:
Hello World 是 Hello World,对吧?
我曾经编写 C 实用程序,然后我将支持 16 位到 64 位架构,包括一些 60 位机器。它们包括至少三种“字节顺序”、不同的浮点格式、不同的字符编码和不同的操作系统(尽管 Unix 占主导地位)。
尽管如此,如果您避免多次编写代码和#ifdef 主要部分代码的诱惑,您会发现跨不同平台进行编码和测试有助于更快地发现错误。你最终会产生更规范、更易于理解、更易于维护的程序。
【讨论】:
【讨论】:
您可能需要了解的一个特定问题(例如,如果您的数据文件需要跨平台工作)是endianness。
数字在不同架构上的二进制级别表示不同。 Big-endian 系统优先排序最高有效字节,little-endian 系统优先排序最低有效字节。
如果您将一些原始数据以一种字节序写入文件,然后在具有不同字节序的系统上读回该文件,您显然会遇到问题。
您应该能够在大多数系统上从sys/param.h 获得编译时的字节顺序。如果您需要在运行时检测它,一种方法是使用int 和char 的并集,然后将char 设置为1,然后查看int 的值。
【讨论】:
这是一个很长的列表。最好的办法是阅读示例。例如source of perl。如果您查看 perl 的源代码,您会看到构建一个处理大约 50 个平台问题的头文件的巨大过程。
读完哭泣,或借阅。
【讨论】:
列表可能很长,但还不如支持 Windows 和 MSDOS。这在许多实用程序中都很常见。
通常的技术是将核心算法模块与处理操作系统的模块分开——基本上是分层抽象的策略。
相比之下,区分几种风格的 unix 相当简单。要么坚持所有功能都使用相同的 RTL 名称,要么查看支持的平台的多数约定以及例外情况中的 #ifdef。
【讨论】:
对于您使用的任何库函数,请继续参考 POSIX 标准。部分标准不明确,一些系统返回不同风格的错误代码。这将帮助您主动发现那些确实很难发现略有不同的实现错误。
【讨论】: