Überladungsauflösungsfehler mit DrawText

8

Beim Portieren von Code von D2007 nach XE2 habe ich einen Compilerfehler bekommen, den ich nicht verstehen kann. Bitte beachten Sie das folgende Beispiel:

%Vor%

D2007 kompiliert das ohne ein Problem. Der XE2-Compiler weist die mit //3 markierte Zeile mit

zurück
  

[DCC Fehler] Unit1.pas (38): E2010 Inkompatible Typen: 'string' und 'Pointer'

Ich schätze, das liegt daran, dass die neu hinzugefügten DrawText Überladungen Delphi Strings akzeptieren.

Können Sie diesen Fehler erklären? Es ist kein großes Problem, da ich einen Workaround habe (explizites Casting), aber ich bin neugierig. Ist der Fehler in späteren Delphi-Versionen noch vorhanden?

Bearbeiten: Ich frage , ob im Compiler ein Fehler auftritt, nicht wegen einer Erklärung warum es dort ist. Es könnte gut sein, dass ich einen gültigen Grund für den Compiler übersehen habe, meinen Code abzulehnen.

    
Uli Gerhardt 31.07.2014, 07:37
quelle

1 Antwort

7

Dies scheint keine normale Überladungsauflösungssituation zu sein. DrawText ist doppelt definiert als:

%Vor%

Mit {$TYPEDADDRESS OFF} scheint ein ^Char vom Compiler als untypisiertes pointer interpretiert zu werden, das niemals mit einem deklarierten Typ von PChar kompatibel ist, während @c anscheinend in ein PChar aufgelöst wird. OK. Dies scheint im Widerspruch zu der Vorstellung zu stehen, dass {$TYPEDADDRESS OFF} dazu gedacht ist, alle Zeiger typen-agnostisch zu machen. Es scheint, dass PChar und ^Char im Compiler irgendwie anders behandelt werden als andere Zeiger.

Mit {$TYPEDADDRESS ON} werden sowohl @c als auch ^Char gleichwertig, aber seltsamerweise werden sie als Argumente akzeptiert, solange es keine Überladungsauflösung gibt.

In beiden Fällen scheint es, dass Überladungsauflösungen abgeschlossen sind, bevor die Typkompatibilität vollständig hergestellt ist . Ich bin mir nicht sicher, ob ich es einen Fehler nennen würde, aber ... es scheint ein Verhalten zu sein, das schwierig zu ändern wäre, ohne Probleme zu verursachen.

SSCCE

%Vor%     
J... 31.07.2014, 12:41
quelle