5

我正在尝试将项目从 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. 但大小为 4str和 256 short。有没有其他方法可以让编译器将源代码中的所有出现替换 string为或者是唯一的解决方案?shortstringstringshortstring

4

1 回答 1

7

$H- 是遗留的,仅用于向后兼容。没有办法强制 Delphi XE2(或 D2009 及更高版本的任何 Delphi 编译器版本)不使用 Unicode 作为默认字符串类型。

编译器指令仍然存在,只是为了防止旧代码在编译时中断。当 Delphi 2009 以仅 Unicode 作为默认字符串类型发布时引起了一些骚动,而没有切换回将 AnsiString 作为默认字符串类型。据解释,他们认为这实际上是不可能的,因为需要有两个不同版本的 RTL、VCL 等。允许 ShortString 成为默认值将需要同样的事情。

您需要将所有字符串引用显式更改为短字符串(或者更好的是,将您的代码修复为不需要它们)。

于 2012-03-06T16:43:20.743 回答