0

我计划使用 Cygwin 套件在 Windows 上使用 Netbeans 编写一个 ANSI-C 程序,稍后我想在 UNIX 系列操作系统上编译源代码并使用该程序。我应该担心任何类型的兼容性问题吗?

4

2 回答 2

1

如果您仅使用 C 标准中描述的功能,则可能的不兼容性集通常会减少为:

  • 的签名char
  • 所有类型的大小(例如int= long= = Windows 中的 32 位,在 UNIX 上不一定如此),我的意思是字面上的所有,包括指针和enums
  • 考虑不周的类型转换和强制转换,尤其是涉及指针和负值(在表达式中混合有符号和无符号类型也容易出错)
  • 类型的对齐及其在结构/联合中的填充
  • 字节序
  • 位域的顺序
  • 实现定义/特定的行为,例如负值的右移、舍入和除有符号值时的符号
  • 浮点:不同的实现和不同的优化
  • 未指定的行为,例如函数参数和子表达式求值的顺序、memcpy()复制数据的方向(低地址到高地址或相反)等
  • 未定义的行为,例如i+i++or a[i]=i++,修改字符串文字,当它指向的对象消失时指针取消引用(例如free()'d),不使用或误用constandvolatile
  • 提供带有不适当参数的标准库函数会导致未定义的行为,例如printf()使用错误数量或类型的参数调用类似函数
  • 非 ASCII 字符/字符串
  • 文件名格式(特殊字符、长度、区分大小写)
  • 时钟/时间/区域设置格式/范围/值/配置

还有更多。您实际上必须阅读标准并注意什么可以保证工作,什么不能工作以及是否有任何条件。

如果您使用 C 标准之外的东西,则该功能在不同平台上可能不可用或相同。

所以,是的,这是可能的,但你必须小心。通常是您做出的假设使您的代码移植性差。

于 2012-10-03T04:22:42.177 回答
1

会有可比性问题,但只要您坚持基本的 unix 功能,它们应该可以用于命令行应用程序。但是,如果您的应用程序具有 GUI 或必须与 unix 环境中的其他程序交互,您可能会后悔您的方法。

另一种方法是在桌面上的虚拟机中运行适当风格的 unix,并确保没有兼容性问题。

于 2012-10-02T19:35:25.173 回答