我计划使用 Cygwin 套件在 Windows 上使用 Netbeans 编写一个 ANSI-C 程序,稍后我想在 UNIX 系列操作系统上编译源代码并使用该程序。我应该担心任何类型的兼容性问题吗?
问问题
339 次
2 回答
1
如果您仅使用 C 标准中描述的功能,则可能的不兼容性集通常会减少为:
- 的签名
char
- 所有类型的大小(例如
int
=long
= = Windows 中的 32 位,在 UNIX 上不一定如此),我的意思是字面上的所有,包括指针和enums
- 考虑不周的类型转换和强制转换,尤其是涉及指针和负值(在表达式中混合有符号和无符号类型也容易出错)
- 类型的对齐及其在结构/联合中的填充
- 字节序
- 位域的顺序
- 实现定义/特定的行为,例如负值的右移、舍入和除有符号值时的符号
- 浮点:不同的实现和不同的优化
- 未指定的行为,例如函数参数和子表达式求值的顺序、
memcpy()
复制数据的方向(低地址到高地址或相反)等 - 未定义的行为,例如
i+i++
ora[i]=i++
,修改字符串文字,当它指向的对象消失时指针取消引用(例如free()'d
),不使用或误用const
andvolatile
等 - 提供带有不适当参数的标准库函数会导致未定义的行为,例如
printf()
使用错误数量或类型的参数调用类似函数 - 非 ASCII 字符/字符串
- 文件名格式(特殊字符、长度、区分大小写)
- 时钟/时间/区域设置格式/范围/值/配置
还有更多。您实际上必须阅读标准并注意什么可以保证工作,什么不能工作以及是否有任何条件。
如果您使用 C 标准之外的东西,则该功能在不同平台上可能不可用或相同。
所以,是的,这是可能的,但你必须小心。通常是您做出的假设使您的代码移植性差。
于 2012-10-03T04:22:42.177 回答
1
会有可比性问题,但只要您坚持基本的 unix 功能,它们应该可以用于命令行应用程序。但是,如果您的应用程序具有 GUI 或必须与 unix 环境中的其他程序交互,您可能会后悔您的方法。
另一种方法是在桌面上的虚拟机中运行适当风格的 unix,并确保没有兼容性问题。
于 2012-10-02T19:35:25.173 回答