2012-03-06 21 views
4

私はDelphi 4からDelphi XE2にプロジェクトを移植しようとしています。私はプロジェクトでshortstringを使用する必要があります。 Delphiヘルプによれば、$ H-は、コンパイラにstringタイプのショートストリングを使用させるべきです。私はこの指令を使用しましたが、違いは見られません。コンパイラはshortstringの両方として扱う必要があるため、出力がstrshortの両方で同じにする必要があります私の意見ではショートストリング用の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では4、shortでは256です。コンパイラにshortstringとしてstringを処理させる方法はありますか?stringのすべてのコードをshortstringに置き換える唯一の解決策はソースコードですか?

+1

'$ H-'は旧式であり、下位互換性のためにのみ提供されています。 Delphi XE2(またはD2009以上のDelphiのコンパイラの任意のバージョン)がUnicodeをデフォルトの文字列型として使用しないようにする方法はありません。明示的にすべての文字列参照をshortstringに変更する必要があります(または、コードを修正する必要はありません)。 –

+0

@KenWhiteあなたの答えをありがとう。それは私の疑惑を裏付けるものです。 Delphi XE 2のString型の[ヘルプセクション](http://docwiki.embarcadero.com/RADStudio/XE2/en/String_Types)には、$ Hディレクティブをその目的のために使用できると書かれています。しかし、私はそれが時代遅れだと思う。 – Maria

+0

コンパイル時に古いコードが破損しないようにするだけです。 Delphi 2009がデフォルトの文字列型としてUnicodeのみでリリースされ、AnsiStringをデフォルトに戻すためのスイッチがなくても、少し騒ぎがありました。これは、RTL、VCLなどの2つの異なるバージョンを持つ必要があるため、これが事実上不可能であると判断したと説明されました。 ShortStringをデフォルトにすることは、同じことを必要とするでしょう。 –

答えて

7

$ H-は旧バージョンとの互換性のためにのみ提供されています。 Delphi XE2(またはD2009以上のDelphiのコンパイラの任意のバージョン)がUnicodeをデフォルトの文字列型として使用しないようにする方法はありません。

コンパイラ指令は、コンパイル時に古いコードが破壊されないようにするためのものです。 Delphi 2009がデフォルトの文字列型としてUnicodeのみでリリースされ、AnsiStringをデフォルトに戻すためのスイッチがなくても、少し騒ぎがありました。これは、RTL、VCLなどの2つの異なるバージョンを持つ必要があるため、これが事実上不可能であると判断したと説明されました。 ShortStringをデフォルトにすることは、同じことを必要とするでしょう。

文字列参照をすべて短文字列に明示的に変更する必要があります(または、文字列参照を必要としないように修正することをお勧めします)。

+0

IMOはエンバカデロのもう一つの愚かな決断です。コードが{$ H-}を使用する場合は、とにかく修正する必要があります。警告なしで{$ H-}を解析するだけでプログラマーにとって難しくなります: - / – etrusco

関連する問題