短字符串的 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.

在我看来,strshort 的输出应该相同,因为编译器应该将两者都视为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 编译器指令不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

ngMessages 在指令模板中不起作用

TaskDialog 在我的 Delphi 程序中不起作用

Delphi的烦恼,“查找声明”通常不起作用

在 delphi 查询中使用 @variables:= 不起作用

Delphi 2010 - 套接字端口 119 不起作用

NumbersOnly TEdit Delphi 提示不起作用