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;