[erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

[erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von alfware17 »

Ich habe in einer alten Anwendung eine Routine wieder aktiviert (Strpas), die eigentlich nur für meine 16bit Version notwendig war, jetzt will ich das aber doch auch bei 32/64 Bit und im Linux machen.

Der FPC 3.2.2.sagt mir "marked as Inline but not Inline". Ich finde es insoweit extrem verstörend, als die Meldung gleich 4x kommt und ich nun jedes Mal beim Compilieren genau hinschauen muss, wo vorher ein kurzer Blick reichte, Fehler oder nicht Fehler.
Ich bin mir fast sicher, das die Meldung früher (FPC 3.0.4) nicht kam Und jetzt auch nur bei der 32bit Version.
Und noch verstörender, es tritt nur beim 1.Compile auf?! Mache ich gleich noch einen hinterher kommt die Meldung nicht wenn ich noch die Nummer (6058) im Quelltext angebe,

Lösche ich die .o bzw .ppu Dateien, kommt die Meldung nicht, lösche ich die Exe damit es quasi der erste Compile im Verzeichnis ist, kommt die Meldung. Ominös? Wie kriege ich das ganz weg?
Zuletzt geändert von alfware17 am Mo 26. Jun 2023, 09:15, insgesamt 2-mal geändert.

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von Warf »

Erstmal, das ist keine Warning, es ist eine "Hint". Kurz zur erklärung, es gibt 3 Abstufungen von Meldungen:
1. Errors: Ein (Fataler) Fehler bei dem der Compiler nicht weiter machen kann. Z.B. wenn du versuchst einen Integer in einen String zu schieben.
2. Warnings: Etwas was der Compiler zwar so schluckt, aber vermutlich nicht so vom Programmierer gewollt war, und vermutlich zu Falschem verhalten führen wird. Warnings kann man grundsätzlich als Fehler die noch geschene werden betrachten. Z.B. wenn du eine veraltete Funktion benutzt die nicht mehr aktualisiert wird und daher zum einen Fehler enthalten kann, zum anderen in einer Zukünftigen version eventuell ganz verschwindet.
3. Hints: Etwas was keine großen auswirkungen hat, aber potentiell für den Entwickler interessant zu wissen ist. Z.B. wenn man eine unbenutzte Variable hat. Kein Fehler, wird vermutlich auch nie zu einem führen, aber ein "Schönheitsmarkel" im code den man aufräumen sollte.

Zu der Inlining hint. Die hat schon zu viel verwirrung geführt warum die auf einmal da ist. Der Grund ist einfach weil die erst seit FPC 3.2.0 oder so überhaupt existiert, daher gibts die in alten FPC versionen nicht.
Was soll die Hint dir sagen? Wenn du eine funktion schreibst kannst du die als "inline" markieren, und damit dem Compiler sagen das er sie inlinen soll. Am besten ein Beispiel:

Code: Alles auswählen

function Times5(X: Integer): Integer; inline;
begin
  Result := X * 5;
end;
Wenn du jetzt die Funktion aufrufst und sie wird nicht geinlined, dann wird der Stack frame Gepusht, ein Call ausgeführt die Multiplikation und am ende ein Return. Ziemlich viel aufwand für eine simple Multiplikation. Die Idee hinter dem Inlining ist dann einfach das was in der Funktion passiert in der Aufrufenden funktion zu machen:

Code: Alles auswählen

Y := Times5(X);
// Wird geinlined zu
Y := X * 5;
Das erlaubt es Code in viele funktionen Aufzuteilen, ohne dabei performance einbußen zu bekommen.

Das Problem ist aber, nur weil irgendwo "inline" drauf steht ist nicht "inline" drin. Der Compiler entscheidet selbst was sich "lohnt" zu inlinen und was nicht. Dabei spielen 2 Faktoren die Hauptrolle, die Funktionskomplexität, und die Inline Tiefe. Beispiel:

Code: Alles auswählen

function Plus3(X: Integer): Integer; inline;
begin
  Result := X + 3;
end;

function Plus3_2(X: Integer): Integer; inline;
begin
  Result := Plus3(X + 3);
end;     

function Plus3_3(X: Integer): Integer; inline;
begin
  Result := Plus3_2(X + 3);
end;

function Plus3_4(X: Integer): Integer; inline;
begin
  Result := Plus3_3(X + 3);
end;

function Plus3_5(X: Integer): Integer; inline;
begin
  Result := Plus3_4(X + 3);
end;

var
  X: Integer;
begin
  ReadLn(x);             
  WriteLn(Plus3_4(X));  // Alles geinlined, also das ist equivalent zu einfach 3 + 3 + 3 + 3
  WriteLn(Plus3_5(X));  // Kein inlining ab Plus3_2, also das ist Plus3_2(X + 3 + 3)
Wie du hier sehen kannst obwohl die Funktionen Plus3_4 und Plus3_5 von der Struktur und Komplexität identisch sind (ein funktionsaufruf und eine Addition) wird das erste geinlined und das zweite wird nur bis Plus3_2 geinlined, weil hier die maximaltiefe überschritten wird.

PS: meines Erachtens nach macht es zwar absolut keinen Sinn bei der untersten Ebene das Inlining auszusetzen statt auf den oberen, da aus meiner erfahrung bei langen inlining chains die Komplexität auf höheren ebenen normalerweise zu nimmt, da hier dann die größeren Formeln sind, wo sich inlining dann weniger lohnt, während auf den untersten ebenen sind dann oftmals die ganz simple Funktionen die einfach nur Daten bereitstellen oder Konvertieren, die typischen Getter und Setter, die Natürlich am besten Gar keinen Overhead erzeugen sollen

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von alfware17 »

Danke für die Erklärung, aber was kann ich denn nun konkret dagegen tun? Ich habe im www gefunden, daß ich es mitttels

Code: Alles auswählen

{$warn 6058 off}
ausschalten könnte, was aber leider nicht so richtig funktioniert. Wie gesagt, beim 1.Compile nicht, beim zweiten dann ja.... Und auch nur beim 32bit FPC. Wenn ich Lazarus compilieren lassen, kann ich es im Menue ausklicken.

Aber ich möchte nicht gleich alle Hints ausschalten (eben weil es manchmal wertvolle Hinweise sind, ich habe zB neulich tatsächlich an dem "Variable wird zugewiesen, aber niemals benutzt etwas gefeilt bei alten Units und dann war das sauber, aber jetzt kommt gleich weider sowas....)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von af0815 »

Du hast die Frage auch hier viewtopic.php?f=10&t=13242&p=135915#p135915 crossgepostet. Dort ist eine Antwort von mir.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: [erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von alfware17 »

Danke für Eure Antworten, mein Problem hat sich gerade auf andere Weise "gelöst" bzw erledigt. Ich kann das nicht so programmieren. Erklärung dazu in einem neuen Thread.

Worum es mir hier (vor allem) ging: das

Code: Alles auswählen

{$warn 6058 off}
wirkt bei mir leider nicht so wie gedacht, wenn ich es direkt mit in den Quelltext schreibe und den FPC dann auf der Kommandozeile aufrufe. Ich könnte den Schalter

Code: Alles auswählen

-vm6058
beim Batch-Aufruf mit angeben, ja - aber ich möchte jetzt nicht wegen jedem Hint meine .BAT Datei anpassen. Andererseits auch nicht alle Hints unterdrücken.

Warum ich nicht (nur) im Lazarus compiliere? Nun, zum Programmieren, Editieren und Testen nehme ich Lazarus nun schon, ich habe mich umgestellt von der FreePascal-eigenen IDE weil es doch komfortabler ist, da hatte ich jahrelang etwas nicht gesehen und so weiter gemacht wie bisher. Den kleinen Umlaute-Schönheitsfehler kann ich verkraften. Und richtig, hier kann ich das konkrete Hint 6058 einfach ausklicken.

Aber: ich compiliere hinterher (wenn eine Programmversion fertig ist) noch einmal für 32/64 bit auf der Kommandozeile, weil ja weil die EXE Dateien, die Lazarus mir baut, irgendwie anders und größer sind. Ich meine nicht die Debug-Informationen, die könnte ich auch ausklicken. Ich lasse es im Lazarus-Projekt aber an, weil die EXE auch ohne Debug-Informationen anders aussieht als vom Batch FPC 32/64.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von fliegermichl »

Du kannst in Projekt -> Projekteinstellungen -> Einstellungen anzeigen ausgeben lassen, mit welchen Parametern der Compiler aufgrufen wird.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: [erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von af0815 »

fliegermichl hat geschrieben:
Mo 26. Jun 2023, 09:49
Du kannst in Projekt -> Projekteinstellungen -> Einstellungen anzeigen ausgeben lassen, mit welchen Parametern der Compiler aufgrufen wird.
Ich nehme an, er meint, wenn er den FPC alleine verwendet, ohne Lazarus, das dann das Warning unterdrückt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von fliegermichl »

af0815 hat geschrieben:
Mo 26. Jun 2023, 13:25
fliegermichl hat geschrieben:
Mo 26. Jun 2023, 09:49
Du kannst in Projekt -> Projekteinstellungen -> Einstellungen anzeigen ausgeben lassen, mit welchen Parametern der Compiler aufgrufen wird.
Ich nehme an, er meint, wenn er den FPC alleine verwendet, ohne Lazarus, das dann das Warning unterdrückt.
Ich meinte nur, daß er da sehen kann mit welchen Parametern der FPC von Lazarus aus aufgerufen wird. Dann kann er mit seiner Batch vergleichen und sieht, wo die Unterschiede herkommen.

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [erledigt] wie (nur) ein Compiler Warning unterdrücken beim FPC Batch Compiler?

Beitrag von Warf »

Ich würde auch generell dazu Raten Lazarus zum Kompilieren zu benutzen (auch in der Komandozeile mit Lazbuild). Damit wird sichergestellt das du die selben Kompilereinstellungen und Konfigurationen beim Testen wie beim Deployment verwendet werden. Ansonsten fehlen potentiell irgendwelche Defines, Suchpfade, falsche Versionsnummern, etc.

Genau dafür hat Lazarus ja die Build-Modi, sodass du einen Debug und einen Release modus haben kannst, das du mit Debug modus Testest und dann im Release Modus eine Optimierte version Kompilierst.

Antworten