2012-03-06 40 views
4

我想將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. 

在我看來,輸出應該是相同的兩個strshort,因爲編譯器應該把兩者作爲一個shortstring。但str的尺寸爲4,short的尺寸爲256。是否有任何其他方式讓編譯器將string當作shortstring或者是在源代碼中用shortstring替換string的所有發生的唯一解決方案?

+1

'$ H-'是遺留的,僅用於向後兼容性。沒有辦法強制Delphi XE2(或D2009及更高版本的Delphi編譯器的任何版本)不使用Unicode作爲默認字符串類型。你需要明確地將所有的字符串引用改爲短字符串(或者更好的是修復你的代碼,使其不需要它們)。 – 2012-03-06 13:46:36

+0

@KenWhite謝謝你的回答。這證實了我的懷疑。在Delphi XE 2字符串類型的[help section](http://docwiki.embarcadero.com/RADStudio/XE2/en/String_Types)中,寫道$ H-指令可以用於此目的。但我認爲那已經過時了。 – Maria 2012-03-06 14:37:19

+0

它只是爲了防止編譯時破壞舊代碼。當Delphi 2009僅以默認字符串類型(僅Unicode)發佈時,沒有切換回到將AnsiString設爲默認字符串,這時有一些騷動。有人解釋說,他們認爲這實際上是不可能的,因爲需要有兩個不同版本的RTL,VCL等等。允許ShortString成爲默認值將需要相同的事情。 – 2012-03-06 15:25:10

回答

7

$ H-是遺留的,僅用於向後兼容性。沒有辦法強制Delphi XE2(或D2009及更高版本的Delphi編譯器的任何版本)不使用Unicode作爲默認字符串類型。

編譯器指令仍然存在,只是爲了防止編譯時破壞舊代碼。當Delphi 2009僅以默認字符串類型(僅Unicode)發佈時,沒有切換回到將AnsiString設爲默認字符串,這時有一些騷動。有人解釋說,他們認爲這實際上是不可能的,因爲需要有兩個不同版本的RTL,VCL等等。允許ShortString成爲默認值將需要相同的事情。

您需要明確地將所有的字符串引用改爲短字符串(或者更好的方法是修復你的代碼,使其不需要它們)。

+0

IMO還有另一個來自Embarcadero的愚蠢決定。如果代碼使用{$ H-},那麼很有可能您必須修復它;解析{$ H-}沒有警告只是讓程序員更難: - / – etrusco 2013-07-25 14:10:16