AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erklärung zu Compiler-Hinweis?

Ein Thema von HJay · begonnen am 25. Okt 2012 · letzter Beitrag vom 25. Okt 2012
Antwort Antwort
Seite 1 von 2  1 2      
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 11:35
Ich stelle gerade ein projekt von Delphi 6 auf Delphi 2010 um.

In einer eigenen, kurzen Unit verwende ich:

Code:
uses Forms, SysUtils;

initialization

DeleteFile(LogFile);
Der Compiler gibt den folgenden Hinweis aus: "H2443 Inline-Funktion "DeleteFile" wurde nicht expandiert, weil Unit 'Windows' in der USES-Liste nicht angegeben ist."

Was soll dieser Hinweis bedeuten? DeleteFile stammt aus SysUtils und nimmt ein String-Argument. Alles klappt, wie es soll. Warum kümmert sich der Compiler darum, dass es in der Unit Windows möglicherweise eine ähnliche lautende Prozedur gibt?

Sind die Prozeduren funktionell gleichwertig? Ich habe immer die aus SysUtils verwendet. Hat eine Vorteile gegenüber der anderen?

Die Prozedur Windows.DeleteFile nimmt ein PChar-Argument, was ich ja eigentloich auch blöde finde. Was spricht dagegen, bei SysUtils.DeleteFile zu bleiben?

Was soll der Hinweise? Muss ich ihn beachten?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 11:37
Gib den Namespace mit an
SysUtils.DeleteFile(LogFile);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 11:40
Was es bedeuten soll steht ja eigentlich ganz genau da.

DeleteFile ist als Inline-Funktion deklariert, also es wird nicht die Funktion aufgerufen, sondern ihr Inhalt wird (wenn möglich) vom Compiler direkt an der Stelle eingebaut, wo du sie aufrufst.

Inline kann aber natürlich nur funktionieren, wenn das, was innerhalb der Funktion aufgerufen/verwendet wird, auch an der Stelle des Funktionsaufrufs verfügbar ist.

Bei dir ist es das nicht, da du kein "Windows" in deinen Uses hast.
Darum wird die Funktion eben "nur" direkt aufgerufen und Delphi sagt dir das, damit du dich nicht wunderst, weil man ja erwarten müßte, daß es Inline ist.

Schlimm isses nicht ... kann man ignorieren ... oder man nimmt die genannte Unit einfach auf.


mkinzler hat auch noch einen Grund genannt.
Ohne Namespace wird das genommen, was als Letztes über die Uses eingebunden wurde.

Gleichwertig ... fast, denn bei dir ist das Delphi-Referenz durchsuchenSysUtils.DeleteFile nur eine Weiterleitung zu Windows.DeleteFile (MSDN-Library durchsuchenDeleteFile, mit einem etwas anderem Parameter, wo man sleber nicht casten muß).
Seit Multiplattform aber nein, denn da wird automatisch, entsprechend von der Zielplattform, die passende "Dateilöschen"-API des Zielsystems aufgerufen.
In Linux, Mac und Co. gibt es ja keine WinAPI.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Okt 2012 um 11:46 Uhr)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#4

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 12:01
Danke für die Erläuterungen!

Ich habe jetzt Windows als erste Unit in die USES-Liste aufgenommen und der Compiler nimmt daher jetzt DeleteFile ohne zu Murren, wohl aus der SysUtils.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 13:07
Kannte D6 schon Code Insight?
Halte mal die Maus über DeleteFile und warte auf einen Hint. (falls er kommt)
Da steht dann drin, was genommen wird.

Und da du die VCL/RTL-Quellcodes besitzt ... Strg+Linksklick auf die Funktion und man landet bei deren Deklaration. (oder Kontextmenü > Deklaration suchen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 15:09
Nochmal danke, ja, den Bubble-Hint kenne ich. D6 hat automatisch SysUtils ausgewählt und D2010 wählt dank richtiger USES-Deklaration auch SysUtils aus. Bei vertauschter USES-Deklaration wählt es Windows.Deletefile aus.

Was mich nur grwundert hatte, war, dass wenn nur (!) SysUtils deklariert sind, dennoch das Meckern über die inline-Sache erfolgt. Falls SysUtils wirklich auf die unit Windows verweist, müsste das dortige USES doch alles erledigen? Na egal, ich führe unit Windows mit auf und fertig.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#7

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 15:26
Was mich nur grwundert hatte, war, dass wenn nur (!) SysUtils deklariert sind, dennoch das Meckern über die inline-Sache erfolgt.
Das hatte ich aber erklärt.

Das meckern kommt nicht, wenn/weil man beides eingebunden hat ... das wirkt sich nur darauf aus, was letztendlich "zuerst" genommen wird.
Ist aber Beides eingebunden und SysUtils als letztes, dann wird SysUtils.DeleteFile verwendet und das leitet dann an Windows.DeleteFile weiter.

Zitat:
Delphi-Quellcode:
function DeleteFile(const FileName: string): Boolean; inline;


function DeleteFile(const FileName: string): Boolean;
{$IFDEF MSWINDOWS}
begin
  Result := Windows.DeleteFile(PChar(FileName));
  ...
SysUtils.DeleteFile ist als inline deklariert.

Der Compiler würde daher gern den internen "Windows.DeleteFile"-Aufruf in deine Unit verlagern,
was aber nicht geht, weil bei dir kein Windows eingebunden ist ... daher der Hinweis.



Hinweis - nix Schlimmes, wollt's nur mal erwähnt haben
Warnung - hey du, da solltest du besser mal aufpassen
Fehler - ich mecker schonmal, mach aber noch ein bissl weiter (bis zum Unitende)
Schwerer Fehler - das mag ich nun überhaupt nicht *streik*
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Okt 2012 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 15:36
Ohne Namespace wird das genommen, was als Letztes über die Uses eingebunden wurde.
Bist du sicher? Ich war immer der Meinung, dass das beachtet wird was zuerst in der Unit steht. Und wenn ich die paar Male bedenke die ich bisher mit dem Problem zu tun hatte, schien die Regel zu stimmen.

Das scheint mal wieder eines von diesen Regeln zu sein: "so funktioniert es nicht, aber keiner hat es dem Compiler mitgeteilt, also funktionierte es".
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 15:41
Das lässt sich doch ganz einfach ausprobieren: 2 Units, die eine gleichlautende Routine aufweisen. Nun bindet man beide ein und schaut, welche beim Aufruf genommen wird. Siehe da, es ist die aus der zuletzt eingebundenen Unit.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#10

AW: Erklärung zu Compiler-Hinweis?

  Alt 25. Okt 2012, 16:29
Das Zuletzteingebundene ist näher beim Code der Unit
und in den Scopes wird immer vom Nächsten zum Entferntesten gesucht,
also wird immer das Letzte gefunden.

Ist genauso wie mit den Variablen.
Die lokalen wurden, in Bezug auf den Scope, zuletzt deklariert und werden zuerst gefunden.


Quasi ein Stack.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz