编写可移植的C程序 - 需要考虑哪些事项?

hel*_*hod 14 c portability

对于大学的项目,我需要扩展现有的C应用程序,该应用程序最终将运行在各种商业和非商业unix系统(FreeBSD,Solaris,AIX等)上.

当我想编写一个最便携的C程序时,我需要考虑哪些事项?

Evi*_*ach 23

我能给出的最好建议是每天转移到不同的平台,随时进行测试.
这将使平台差异像拇指一样突出,并同时教你可移植性问题.

保存跨平台测试到最后,将导致失败.

除此之外

  • 整数大小可以变化.
  • 浮点数可能表示不同.
  • 整数可以有不同的字节序.
  • 编译选项可能有所不同.
  • 包含文件名可以有所不同.
  • 位字段实现会有所不同.

通常最好将编译器警告级别设置得尽可能高,以查看编译器可以抱怨的各种事情.


mpe*_*ez0 7

我曾经写过C实用程序,然后我会支持16位到64位架构,包括一些60位机器.它们包括至少三种"字节序",不同的浮点格式,不同的字符编码和不同的操作系统(尽管Unix占主导地位).

  1. 尽可能接近标准C.对于不属于标准的函数/库,请使用尽可能广泛支持的代码库.例如,对于网络,使用BSD套接字接口,使用零级或最小级别的套接字选项,带外信令等.为了以最少的人员支持大量不同的平台,您将不得不停留具有普通的香草功能.
  2. 要非常清楚标准所保证的是什么,这是典型的实现行为.例如,指针的大小不一定与整数相同,指向不同数据类型的指针可能具有不同的长度.如果您必须依赖于实现假设,请将其记录下来.Lint,或--strict,或者您的开发工具集具有的等价物,在这里至关重要.
  3. 头文件是你的朋友.使用实现定义的宏和常量.使用标头定义和#ifdef来帮助隔离那些需要涵盖少量备选方案的实例.
  4. 不要假设当前平台使用EBCDIC字符和压缩十进制整数.有相当数量的ASCII - 两个补充机器.:-)

有了这些,如果你避免多次写东西和#ifdef代码的主要部分的诱惑,你会发现跨不同平台的编码和测试有助于更快地发现错误.你最终会制作出更有纪律,可理解,可维护的程序.

  • [单一UNIX规范版本3](http://www.unix.org/version3/overview.html)有一个[接口表](http://www.unix.org/version3/inttables.pdf)的文档该指南旨在为程序员迁移到单一 UNIX 规范版本 3 或为其开发应用程序提供快速参考指南。 [迁移指南](http://www.unix.org/version3/mig_guide.pdf) 参见此处。我想如果您正在考虑选择一个功能,请参考接口表以查看哪些平台强制要求它。如果数量不多,请考虑采用不同的方法。 (2认同)

ami*_*mit 5

  1. 至少使用两个编译器。
  2. 拥有一个持续构建系统,最好在各种目标平台上构建。
  3. 如果您不需要非常底层的工作,请尝试使用一些提供抽象的库。您不太可能找不到为您需要的东西提供良好抽象的第三方库。例如,对于网络和通信,有ACE。Boost(例如文件系统)也被移植到多个平台。这些是 C++ 库,但也可能有其他 C 库(例如curl)。
  4. 如果您必须在低级别工作,请注意,即使在像 posix 这样的平台上,它们应该具有相同的行为,但平台有时也会有不同的行为。您可以查看上面库的源代码。