Delphi会默默地截断字符串常量

7

Delphi 2009 Win32.

下面的代码试图向一个备忘录添加一个长度为257的字符串。它可以编译并运行,但是什么都没有添加到备忘录中。

Memo1.Lines.Add('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

看起来像是编译器的bug。是吗?因为如果字符串长度为256,我将得到一个编译器错误,无法编译应用程序。

有没有办法在开发人员尝试执行此类操作时使应用程序崩溃?

我知道我可以分割字符串并使此代码工作,但我的重点是防止开发人员在不注意的情况下使用此无效代码。

谢谢

5个回答

14

这是一个关于Delphi 2009字符串字面值的bug,它应该会像D2007一样引发相同的错误。

尝试使用最新版本的Andreas IDE Fix pack,它应该可以修复此问题。 http://andy.jgknet.de/blog/?page_id=246


1
Andreas一遍又一遍地修复Delphi。 :) - Erick Sasse
是的,安德烈亚斯做得非常好! - Edwin Yip

2
我同意Gamecat的观点,但是如果你处理的是如此大的字符串,我建议将其分成多行以方便阅读和编辑。
如果您确实要创建257个"a",为什么不使用StrUtils单元中的DupeString函数呢?
Memo.Lines.Add( DupeString('a',257) );

这样更易于阅读,以后也更容易维护。如果您正在循环中执行此操作,因此担心性能问题,请将函数结果分配给本地变量并使用该变量。

var
  sLotsOfAs : string;
  ix : integer;
begin
  sLotsOfAs := DupeString('a',257);
  for ix := 0 to 1000000 do
    Memo.Lines.Add( sLotsOfAs );
end;

1
字符串文字只能长达255个字符。不确定为什么他们保留了这个限制。但是,您可以使用多个文字来解决它:
Memo1.Lines.Add('i have 128 chars' + 'i also have 128 chars').

0

我不知道D2009,但至少在Delphi 6下,字符串字面量被限制为255个字符,并且编译器会诊断错误。


我相信 255 的限制是由于 Delphi(至少在 D2009 之前)将长度存储在字符串缓冲区的第一个字节中。也就是说,string[0] 是长度,并且作为一个字节,它可以存储 0-255。 - WileCau
自 Delphi 2 版本以来,所有版本都支持长字符串变量,并且不受 255 个字符的限制。但是,似乎除了字符串字面值! - anon

0
在Delphi 2007中,我得到:
[DCC Error] Unit1.pas(29): E2056 String literals may have at most 255 elements

在Delphi 5中,我得到:
[Error] Unit1.pas(29): String literals may have at most 255 elements

如果D2009的行为如您所描述,那么有两件事情值得注意:
1- 他们扩展了字符串中字符数量的限制,但TMemo仍然只能接受最多255个字符。
或者
2- 这只是一个普通的错误。
至于如何防止它,我唯一能想到的就是创建一个正则表达式,在您的.PAS文件中搜索这些字符串。

鉴于Cesar Romero的回答...您是否安装了IDE Fix包? - JosephStyons
我怀疑他是否安装了2.6 Beta 1,因为这是全新的版本,在Cesar Romero发布链接之前并不对公众开放。 - Andreas Hausladen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接