我想將Delphi 4中的項目移植到Delphi XE2中。我有要求在項目中使用shortstring
。根據Delphi幫助,$ H-應使編譯器對string
類型使用短弦。我使用過這個指令,但是我沒有看到任何區別。我寫了一個小測試程序:Delphi編譯器指令短語不工作?
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
或者是在源代碼中用shortstring
替換string
的所有發生的唯一解決方案?
'$ H-'是遺留的,僅用於向後兼容性。沒有辦法強制Delphi XE2(或D2009及更高版本的Delphi編譯器的任何版本)不使用Unicode作爲默認字符串類型。你需要明確地將所有的字符串引用改爲短字符串(或者更好的是修復你的代碼,使其不需要它們)。 – 2012-03-06 13:46:36
@KenWhite謝謝你的回答。這證實了我的懷疑。在Delphi XE 2字符串類型的[help section](http://docwiki.embarcadero.com/RADStudio/XE2/en/String_Types)中,寫道$ H-指令可以用於此目的。但我認爲那已經過時了。 – Maria 2012-03-06 14:37:19
它只是爲了防止編譯時破壞舊代碼。當Delphi 2009僅以默認字符串類型(僅Unicode)發佈時,沒有切換回到將AnsiString設爲默認字符串,這時有一些騷動。有人解釋說,他們認爲這實際上是不可能的,因爲需要有兩個不同版本的RTL,VCL等等。允許ShortString成爲默認值將需要相同的事情。 – 2012-03-06 15:25:10