短字符串的 Delphi 编译器指令不起作用?
Posted
技术标签:
【中文标题】短字符串的 Delphi 编译器指令不起作用?【英文标题】:Delphi compiler directive for shortstrings not working? 【发布时间】:2012-03-06 08:41:25 【问题描述】:我正在尝试将项目从 Delphi 4 移植到 Delphi XE2。我需要在项目中使用shortstring
。根据 Delphi 帮助,$H- 应该使编译器使用 string
类型的短字符串。我已经使用了这个指令,但我没有看到任何区别。我写了一个小测试程序:
program Stringtest;
$APPTYPE CONSOLE
$R *.res
$H-
uses
System.SysUtils;
var
str : string;
short : shortstring;
begin
try
str := 'testing';
short := 'testing';
Writeln('str ' +Format('%d', [sizeOf(str)]) );
Writeln('short ' +Format('%d', [sizeOf(short)]) );
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
在我看来,str
和short
的输出应该相同,因为编译器应该将两者都视为shortstring
。但str
的大小为 4,short
的大小为 256。是否有任何其他方法可以让编译器将string
视为shortstring
,或者是在源代码中将所有出现的string
替换为shortstring
的唯一解决方案?
【问题讨论】:
$H-
是旧版,仅用于向后兼容。没有办法强制 Delphi XE2(或 D2009 及更高版本的任何 Delphi 编译器版本)不使用 Unicode 作为默认字符串类型。您需要将所有字符串引用显式更改为短字符串(或者更好的是,将您的代码修复为不需要它们)。
@KenWhite 谢谢你的回答。这证实了我的猜想。在 Delphi XE 2 的字符串类型的 help section 中,写入 $H- 指令可用于该目的。但我想那已经过时了。
它只是为了防止旧代码在编译时被破坏。当 Delphi 2009 以仅 Unicode 作为默认字符串类型发布时引起了一阵骚动,而没有切换回将 AnsiString 作为默认字符串类型。据解释,他们认为这实际上是不可能的,因为需要有两个不同版本的 RTL、VCL 等。允许 ShortString 成为默认值也需要同样的事情。
@KenWhite,为什么不发表您的评论作为答案?
@ken 是的,请把这些 cmets 变成答案
【参考方案1】:
$H- 是遗留的,仅用于向后兼容。没有办法强制 Delphi XE2(或 D2009 及更高版本的任何 Delphi 编译器版本)不使用 Unicode 作为默认字符串类型。
编译器指令仍然存在,只是为了防止旧代码在编译时被破坏。当 Delphi 2009 以仅 Unicode 作为默认字符串类型发布时引起了一阵骚动,而没有切换回将 AnsiString 作为默认字符串类型。据解释,他们认为这实际上是不可能的,因为需要有两个不同版本的 RTL、VCL 等。允许 ShortString 成为默认值也需要同样的事情。
您需要将所有字符串引用显式更改为短字符串(或者更好的是,将您的代码修复为不需要它们)。
【讨论】:
IMO 又一个来自 Embarcadero 的愚蠢决定。如果代码使用 $H- ,那么你很有可能无论如何都必须修复它;在没有警告的情况下解析 $H- 只会让程序员更难:-/以上是关于短字符串的 Delphi 编译器指令不起作用?的主要内容,如果未能解决你的问题,请参考以下文章