【问题标题】:C - Writing On Windows Compiling On UNIX And Vice VersaC - 在 Windows 上编写在 UNIX 上编译,反之亦然
【发布时间】:2012-09-23 16:43:28
【问题描述】:

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

【问题讨论】:

  • 行终止符,确保为每个系统/编译器使用正确的格式。
  • 你能解释的更详细些吗?
  • UNIX 系统以\n 终止文本文件行,而Windows 倾向于\r\n 行终止。您可能需要在两者之间进行转换,或者找到一个选项来切换 Netbeans 中的默认类型。可能是一个称为换行符或行终止的选项。
  • @TheZ - 在 C 中使用 \n 应该 表示“行终结符,不管它是什么”,除非您使用二进制模式(又名“raw”)I/O(也是 google 的 [raw 与熟终端 io]),即以文本模式将字符串“one line\n”写入文件应该写入正确的平台行结尾。问题主要出现在系统之间移动写入的文本文件时,而不是移动源代码时出现。
  • @StephenP 这不是真的,我之前切换过系统和编译器,并且在响应意外的换行符时抛出了非常神秘的错误。所以它需要注意的。

标签: c windows unix compilation


【解决方案1】:

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

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

还有更多。实际上,您必须阅读标准并注意哪些保证有效,哪些无效,以及是否有任何条件。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。还有一个问题,反之亦然吗?我的意思是在 Windows 上编写 UNIX 编译。
    • 我只在 windows->unix 方向工作过,但只要你坚持最小公分母子集,你应该没问题。您必须处理的简单事情是行尾、int 大小、文件命名约定等。
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多