Warum dieser Code:Str in XE7 erzeugt seltsame Warnung
w: word;
s: String;
begin
str(w, s);
diese Warnung in XE7 erzeugen:
[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'
Tom
Warum dieser Code:Str in XE7 erzeugt seltsame Warnung
w: word;
s: String;
begin
str(w, s);
diese Warnung in XE7 erzeugen:
[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'
Tom
System.Str
ist eine intrinsische Funktion, die von einer byegone Zeit stammt . Die documentation sagt dies:
Prozedur Str (const X [: Breite [: Dezimalzahlen]]; var S: String);
....
Hinweise: W1057 Implizite String-Umwandlung von '% s' zu '% s' (Delphi): Um jedoch dieses Verfahren auf der Verwendung der Compiler eine Warnung ausgeben kann.
Wenn keine Zeichenfolge mit einer vordefinierten Mindestlänge benötigt wird, verwenden Sie stattdessen die IntToStr-Funktion.
Da dies ein intrinsischer ist, gibt es wahrscheinlich etwas Besonderes. Hinter den Kulissen wird die intrinsische Funktion durch einen Aufruf einer RTL-Unterstützungsfunktion implementiert, die eine ShortString
ergibt. Compiler Magie macht dann das zu einem string
. Und warnt dich vor der impliziten Konvertierung. Der Compiler Magie verwandelt
Str(w, s);
in
s := _Str0Long(w);
Wo _Str0Long
ist:
function _Str0Long(val: Longint): _ShortStr;
begin
Result := _StrLong(val, 0);
end;
Seit _Str0Long
kehrt ein ShortString
dann der Compiler Code zu generieren, hat die implizite converstion von ShortString
bis zur Durchführung string
wenn es Ihrer Variablen s
zuweist. Und natürlich ist es natürlich, dass Sie W1057 sehen.
Die Quintessenz ist, dass Str
nur existiert, um die Kompatibilität mit Pascal ShortString
Legacy-Code zu erhalten. Neuer Code sollte nicht Str
aufrufen. Sie sollten tun, was die Dokumentation sagt und rufen IntToStr
:
s := IntToStr(w);
Oder vielleicht:
s := w.ToString;
Zuweisen von System.Str zu ShortString ist eine Möglichkeit, eine ganze Zahl in Text zu konvertieren, ohne die Heapspeicherzuordnung zu treffen. –
@LURD Wahre dat. Ich würde sagen, dass es bessere Wege gibt. In jedem Fall werden wir hier zu "string" zuordnen. Aber für jene Randfälle, in denen Perf kritisch ist, kann ein Fall zur Vermeidung von Haufen mit "Str" gemacht werden. –
David: Du hast mir große Zurückhaltung gezeigt, als du "RTFM" nicht in deinen Beitrag aufgenommen hast. Danke für deine übliche gründliche Antwort. Da wir mehr als eine Million Codezeilen migrieren, verwende ich die Route "so wenig wie möglich ändern" in dieser ersten Phase, indem ich $ WARNINGS OFF für die wenigen Zeilen Code verwende, die diesen Code aufrufen. (Sie sind eigentlich Str (w: 3: 1, S), also ist da mehr los als das einfache Beispiel, das ich zur Verfügung gestellt habe ... – Tom
Einer der vielen Compiler-Warnungen ich zu tun habe von XE2 zu XE7 seit dem Upgrade. –
Compiler erzeugt tatsächlich einen Aufruf an _StrLong, der eine Kurzzeichenfolge zurückgibt. Dies ist natürlich keine Antwort. –
@Jerry - Dies ist das gleiche für XE2. –