【问题标题】:conditional defines for desktop and mobile compiler桌面和移动编译器的条件定义
【发布时间】:2015-05-18 16:24:34
【问题描述】:

我正在开发一个跨平台库,该库应该在 Delphi 支持的桌面和移动编译器中编译。 正如我们所知,桌面中的字符串是基于 1 的,而移动设备中的字符串是基于 0 的。 Delphi 中是否有任何定义可用于分离可在桌面和移动设备中编译的代码,并且至少向后兼容至 XE2。

类似 if 定义桌面执行此操作,否则移动执行此操作。

抱歉格式错误。从手机打字。

Delphi 版本 XE7 up 1.

【问题讨论】:

  • 这里有很好的定义:docwiki.embarcadero.com/RADStudio/en/…
  • 可以使用{$ZEROBASEDSTRINGS OFF}关闭基于0的字符串索引
  • @David,感谢您的建议,但不幸的是,在平台部分,我无法确定 POSIX 和 posix32 是属于桌面版还是移动版。如果我能在将平台部分分类到桌面和移动设备方面获得任何帮助,我将不胜感激。
  • @Remy,谢谢,但我很想先尝试其他选择。
  • @Xor-el:即使在移动设备中,所有 RTL 函数都是从 1 开始的。即使在桌面中,所有 String 辅助方法都是从 0 开始的。整个 ZBS 问题影响[] 字符串索引运算符,仅此而已。因此,如果您愿意,您可以在移动设备上编写基于 1 的代码,在桌面上编写基于 0 的代码。 Embarcadero 希望每个人都远离基于 1 的 RTL 和 use 0-based strings,适用于所有桌面和移动设备。但是,如果向后兼容性是一个问题,您将无法做到这一点。

标签: delphi


【解决方案1】:

这里记录了条件:http://docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi)

我认为您提出的问题的答案是您应该打开NEXTGEN 条件。

但是,仅仅因为您正在为移动设备进行编译(即NEXTGEN)并不意味着字符串必须从零开始。同样,没有强制要求桌面代码是基于一个的。可以使用$ZEROBASEDSTRINGS 指令启用/禁用从零开始的字符串。

你真的应该尽量避免条件编译。条件编译显着增加了复杂性,使测试更加困难,并增加了缺陷的风险。我强烈建议您尽量避免条件编译。

因此,对于每个单元,您应该决定是基于零还是基于一,并在该单元的顶部包含适当的指令。如果您打算使用基于一的 RTL 函数,例如 PosCopy,请使用基于一的方法。否则使用字符串助手(在 XE3 中引入)并从零开始。该决定与您的代码是针对台式机还是移动设备并没有真正的关系。

最后,您说您想在 XE2 上支持移动设备,但是那里的编译器是 FreePascal,它使用基于字符串的字符串。支持 XE2 移动版是另一层复杂性。

【讨论】:

  • XE2 不支持移动开发,只支持 Windows 和 OSX。 XE4 中添加了 iOS,XE6 中添加了 Android。
  • @Remy XE2 通过 FPC 支持 iOS。 XE3 删除了它。 XE4 通过基于 llvm 的下一代编译器恢复了它。您知道这一点,但可能忘记了 XE2 像差。
  • @David 和 Remy,非常感谢您的精彩回答。我学到了很多。我决定使用基于一个的 RTL 函数。
  • 那么您将在所有单位中使用{$ZEROBASEDSTRINGS ON}
  • @david ,刚刚编辑了我之前的评论。错字错误。我将在所有单位中使用 {$ZEROBASEDSTRINGS OFF}。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2012-02-24
  • 2018-11-11
  • 1970-01-01
相关资源
最近更新 更多