Str в XE7 генерирует странное предупреждение

почему этот код:

  w: word;
  s: String;
begin
  str(w, s);

создайте это предупреждение в XE7:

[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'

Тома

1 ответов


System.Str является внутренней функцией, которая датируется эпохой byegone. The документация говорит:

процедуры(константный х [ширина [:параметр Decimals]]; VAR в с: строка);

....

Примечания: однако при использовании этой процедуры компилятор может выдать предупреждение: неявная строка W1057, приведенная от "%s " до "%s " (Delphi).

если строка с предопределенной минимальной длиной не требуется, попробуйте использовать функцию IntToStr.

поскольку это внутреннее, вероятно, происходит что-то дополнительное. За кулисами внутренняя функция реализуется вызовом функции поддержки RTL, которая дает ShortString. Затем магия компилятора превращает это в string. И предупреждает Вас о неявном преобразовании. Компилятор magic transforms

Str(w, s);

на

s := _Str0Long(w);

здесь _Str0Long - это:

function _Str0Long(val: Longint): _ShortStr;
begin
  Result := _StrLong(val, 0);
end;

С _Str0Long возвращает ShortString тогда компилятор должен генерировать код для выполнения неявных разговор с ShortString to string когда он присваивает переменной s. И, конечно, это естественно, что вы видите W1057.

суть в том, что Str существует только для сохранения совместимости с legacy Pascal ShortString код. Новый код не должен вызывать Str. Вы должны сделать то, что говорится в документации, и позвонить IntToStr:

s := IntToStr(w);

или возможно:

s := w.ToString;