Директива компилятора Delphi для коротких строк не работает? - PullRequest
4 голосов
/ 06 марта 2012

Я пытаюсь перенести проект с 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.

По моему мнению, выходные данные должны быть одинаковыми как для str, так и short, потому что компилятор должен рассматривать оба параметра как shortstring.Но размер 4 для str и 256 для short.Есть ли другой способ заставить компилятор трактовать string как shortstring или это единственное решение, которое заменяет все вхождения string на shortstring в исходном коде?

1 Ответ

7 голосов
/ 06 марта 2012

$ H- является устаревшим, предоставляется только для обратной совместимости. Нет никакого способа заставить Delphi XE2 (или любую версию компилятора Delphi от D2009 и выше) не использовать Unicode в качестве строкового типа по умолчанию.

Директива компилятора все еще существует только для предотвращения разрушения старого кода при компиляции. Был небольшой шум, когда Delphi 2009 был выпущен с Unicode-only в качестве строкового типа по умолчанию, без переключателя, чтобы вернуть AnsiString по умолчанию. Было объяснено, что они определили, что это будет практически невозможно из-за необходимости иметь две разные версии RTL, VCL и так далее. Разрешение ShortString стать значением по умолчанию потребует того же самого.

Вам нужно будет явно изменить все ваши строковые ссылки на короткие строки (или, что еще лучше, исправить код, чтобы он не требовался).

...