2015-01-30 18 views
8

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

+0

Einer der vielen Compiler-Warnungen ich zu tun habe von XE2 zu XE7 seit dem Upgrade. –

+0

Compiler erzeugt tatsächlich einen Aufruf an _StrLong, der eine Kurzzeichenfolge zurückgibt. Dies ist natürlich keine Antwort. –

+0

@Jerry - Dies ist das gleiche für XE2. –

Antwort

5

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; 
+0

Zuweisen von System.Str zu ShortString ist eine Möglichkeit, eine ganze Zahl in Text zu konvertieren, ohne die Heapspeicherzuordnung zu treffen. –

+0

@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. –

+0

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