gpt4 book ai didi

delphi - 自 Delphi XE5 以来,如何以向后兼容的方式处理基于 0 的字符串?

转载 作者:行者123 更新时间:2023-12-03 14:34:48 25 4
gpt4 key购买 nike

我正在尝试将当前的 Delphi 7 Win32 代码以最小的更改转换为 Delphi XE5 Android,以便我的项目可以从一系列 Delphi 版本交叉编译为 Win32,并从 XE5 交叉编译为 Android。

从 XE5 开始,针对 future 的语言发生了重大变化。其中之一是从零开始的字符串。

在具有基于 1 的字符串的旧版本中,以下代码是正确的:

function StripColor(aText: string): string;
begin
for I := 1 to Length(aText) do

但现在这显然是不对的。建议的解决方案是使用:

for I := Low(aText) to High(aText) do

这样,XE5 Win32 可以正确处理从 1 开始的字符串,而 XE5 Android 可以正确处理从 0 开始的字符串。然而有一个问题 - 以前的 Delphi 版本(例如 XE2)在此类代码上输出错误:

E2198 Low cannot be applied to a long string
E2198 High cannot be applied to a long string

我有相当多的字符串操作代码。我的问题是 - 如何修改并保持上述代码在 Delphi 7 Win32 和 Delphi XE5 Android 中可编译?

附注我知道我仍然可以在 XE5 中禁用 ZEROBASEDSTRINGS 定义,但这是不需要的解决方案,因为在 XE6 中此定义可能会消失,并且所有字符串将被迫从 0 开始。

最佳答案

如果您想支持使用基于一个的字符串的版本,则不要定义ZEROBASEDSTRINGS。这就是该条件的目的。

没有迹象表明我知道该条件将很快被删除。它在 XE3 中引入,并在随后的两个版本中幸存下来。如果 Embarcadero 删除它,他们的 Win32 客户都不会升级,他们就会破产。 Embarcadero 拥有保持兼容性的良好记录。您仍然可以使用 TP 对象和短字符串。预计此条件的存在时间与桌面编译器一样长。

事实上,所有证据都表明移动编译器保留了对基于单一字符串索引的支持。所有utility string functions like Pos use one based indices, and will continue to do so 。如果 Embarcadero 真的要取消对基于字符串索引的支持,他们也会删除 Pos。我认为这不太可能很快发生。

从表面上看你的问题,尽管编写返回字符串的低索引和高索引的函数很简单。您只需在编译器版本上使用 IFDEF 即可。

function StrLow(const S: string): Integer; inline;
begin
Result := {$IFDEF XE3UP}low(S){$ELSE}1{$ENDIF}
end;

function StrHigh(const S: string): Integer; inline;
begin
Result := {$IFDEF XE3UP}high(S){$ELSE}Length(S){$ENDIF}
end;

更新

正如 Remy 指出的那样,上面的代码并不好。这是因为 ZEROBASEDSTRINGS 是本地的,重要的是它在使用此类函数的地方的状态。事实上,以有意义的方式实现这些功能是不可能的。

因此,我相信,对于需要使用旧版编译器以及移动编译器进行编译的代码,您别无选择,只能禁用。 零基字符串

关于delphi - 自 Delphi XE5 以来,如何以向后兼容的方式处理基于 0 的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19488010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com