String 短字符串的Delphi编译器指令不起作用?

String 短字符串的Delphi编译器指令不起作用?,string,delphi,delphi-xe2,compiler-directives,String,Delphi,Delphi Xe2,Compiler Directives,我正在尝试将一个项目从Delphi4移植到DelphiXe2。我需要在项目中使用短字符串。根据Delphi帮助,$H-应该使编译器使用短字符串作为字符串类型。我用过这个指令,但我看不出有什么不同。我编写了一个小测试程序: program Stringtest; {$APPTYPE CONSOLE} {$R *.res} {$H- } uses System.SysUtils; var str : string; short : shortstring; begin try

我正在尝试将一个项目从Delphi4移植到DelphiXe2。我需要在项目中使用短字符串。根据Delphi帮助,$H-应该使编译器使用短字符串作为字符串类型。我用过这个指令,但我看不出有什么不同。我编写了一个小测试程序:

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,缩写是256。是否有其他方法让编译器将字符串视为shortstring,或者是将源代码中出现的所有字符串替换为shortstring的唯一解决方案?

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

编译器指令仍然存在,只是为了防止旧代码在编译时被破坏。当Delphi 2009发布时,只有Unicode作为默认字符串类型,没有一个开关可以恢复到AnsiString作为默认字符串类型,这引起了一阵骚动。据解释,他们认为这实际上是不可能的,因为需要有两个不同版本的RTL、VCL等。允许ShortString成为默认值也需要同样的条件


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

$H-是遗留的,仅用于向后兼容。无法强制Delphi XE2或D2009及更高版本的Delphi编译器的任何版本不使用Unicode作为默认字符串类型。您需要将所有字符串引用显式更改为shortstring,或者更好的做法是,将代码修改为不需要它们。@KenWhite感谢您的回答。这证实了我的怀疑。在DelphiXe2的for字符串类型中,编写了$H-指令可用于此目的。但我想那已经过时了。它只是为了防止旧代码在编译时被破坏。当Delphi 2009发布时,只有Unicode作为默认字符串类型,没有一个开关可以恢复到AnsiString作为默认字符串类型,这引起了一阵骚动。据解释,他们认为这实际上是不可能的,因为需要有两个不同版本的RTL、VCL等。允许短字符串成为默认值也需要同样的条件。@KenWhite,为什么不将您的评论作为答案发布?@ken yes,请将这些评论变成回答,这是Embarcadero又一个愚蠢的决定。如果代码使用了{$H-},那么很有可能您必须修复它;在没有警告的情况下解析{$H-}只会让程序员更难:-/