Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Delphi und FPC compiler problem (https://www.delphipraxis.net/211212-delphi-und-fpc-compiler-problem.html)

KodeZwerg 15. Aug 2022 09:44


Delphi und FPC compiler problem
 
Obwohl laut meiner direktive der compiler hier unter Nutzung von Delphi nicht reingehen sollte, meckert er.
(Turbo Delphi 2006 nutze ich um Ansi/Wide Unterstützung getrennt zu testen mit Delphi Rio)
Da ich nun auch Lazarus/FPC Unterstützen möchte, hab ich mir das hier zusammen gebastelt:
Delphi-Quellcode:
{$IFDEF FPC}
  {$IF Defined(FPC_VERSION)}
    {$IF FPC_VERSION >= 3}  // [Pascal Error] kz.inc(80): E2026 Constant expression expected
      {$DEFINE UNICODE}
    {$IFEND FPC_VERSION}
  {$IFEND FPC_VERSION}
{$ENDIF FPC}
Kann mir bitte jemand helfen :angel:

Rolf Frei 15. Aug 2022 12:33

AW: Delphi und FPC compiler problem
 
Das Problem ist, dass die Konstante FPC_VERSION in Delphi nicht existiert. Daher muss diese wohl zuvor bei Delphi bekannt gemacht werden. So würde es gehen:
Delphi-Quellcode:
{$IFNDEF FPC_VERSION}
  const FPC_VERSION = 0;
{$ENDIF}
{$IFDEF FPC}
  {$IF Defined(FPC_VERSION)}
    {$IF FPC_VERSION >= 3}  // [Pascal Error] kz.inc(80): E2026 Constant expression expected
      {$DEFINE UNICODE}
    {$IFEND FPC_VERSION}
  {$IFEND FPC_VERSION}
{$ENDIF FPC}

himitsu 15. Aug 2022 12:39

AW: Delphi und FPC compiler problem
 
Nee, wozu?
Delphi-Quellcode:
{$IF Defined(FPC_VERSION)}
fängt ja ab, falls es das nicht gibt. (in einem uralten FPC)
Und bereits
Delphi-Quellcode:
{$IFDEF FPC}
passt auf, dass es im Delphi garnicht ausgeführt wird. :stupid:


Klingt aber fast so, als sei FPC_VERSION bei dir keine "echte" Konstante, aber wenn sie vom Compilier kommt, dann sollte es doch eigentlich passen.
also z.B.
Delphi-Quellcode:
const FPC_VERSION: Integer = 123;

Außerdem wird deine Prüfung garnicht funktionieren, da FPC_VERSION ein DECLARE und kein DEFINE ist uns somit wird IFDEF/IFNDEF dennoch anschlagen, selbst wenn es existiert.
Und auch das
Delphi-Quellcode:
{$IF Defined(FPC_VERSION)}
entspricht dem
Delphi-Quellcode:
{$IFDEF FPC_VERSION}
.

Delphi-Quellcode:
{$IFNDEF FPC}
  const FPC_VERSION = 0;
{$IFEND}

oder besser das, was man eigentlich machen will (wenn nicht existiert, dann erstellen)
{$IF not Declared(FPC_VERSION)}
  const FPC_VERSION = 0;
{$IFEND}
also
Delphi-Quellcode:
{$IFDEF FPC}
  {$IF Declared(FPC_VERSION)}  <<<<<<<<<<<<<<<<<<<<<< Declared, nicht Defined
    {$IF FPC_VERSION >= 3}
      {$DEFINE UNICODE}
    {$IFEND FPC_VERSION}
  {$IFEND FPC_VERSION}
{$ENDIF FPC}

{$IF Defined(FPC) and Declared(FPC_VERSION) and (FPC_VERSION >= 3)}
  {$DEFINE UNICODE}
{$IFEND}

und da FPC_VERSION eh immer nur im FPC existiert (außer jemand macht sowas Böses, wie der Rolf), wäre der erste Teil implizit im Zweiten mit enthalten
{$IF Declared(FPC_VERSION) and (FPC_VERSION >= 3)}
  {$DEFINE UNICODE}
{$IFEND}
ConditionalExpressions {$IF} sollten ja inzwischen alle Compiler seit Jahrzehnten können.

Rolf Frei 15. Aug 2022 12:47

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von himitsu (Beitrag 1510142)
Nee, wozu?
Delphi-Quellcode:
{$IF Defined(FPC_VERSION)}
fängt ja ab, falls es das nicht gibt. (in einem uralten FPC)
Und bereits
Delphi-Quellcode:
{$IFDEF FPC}
passt auf, dass es im Delphi garnicht ausgeführt wird. :stupid:

Das würde ich auch erwarten, aber teste es bitte selber. Delphi interessiert des IFDEF FPC garnicht und wertet auch alle darin enthaltenen IFDEF's, etc. aus. Das führt zu dem erwähnten Fehler. Mein Code funktioniert. Ob das ein Bug ist oder nicht, weiss ich aber nicht so recht.

himitsu 15. Aug 2022 12:57

AW: Delphi und FPC compiler problem
 
Das würde aber bedeuten, dass FPC im Delphi irgendwo definiert wäre, was es aber eigentlich nicht ist. :gruebel:

Zitat:

Delphi-Quellcode:
{$IFDEF FPC}
  {$IF Defined(FPC_VERSION)}

Also eigentlich sollte es im Delphi garnicht an den Beiden vorbei kommen.


Und wie gesagt ... Defined vs. Declared. (man könnte aber Beides machen, also etwas deklarieren und etwas Gleichnamiges definieren)
Konstanten/Variablen/Klassen/Typen/Funktionen sind Deklariert, aber nicht Definiert.

mytbo 15. Aug 2022 12:59

AW: Delphi und FPC compiler problem
 
Wenn ich mich richtig erinnere, verwendest du mORMot. Dann könnte die mormot.defines.inc eine Option für dich sein.

Bis bald...
Thomas

Uwe Raabe 15. Aug 2022 13:10

AW: Delphi und FPC compiler problem
 
Das sieht schwer nach einem Bug aus und hat eine gewisse Ähnlichkeit mit RSP-37123.

Das Problem lässt sich bis mindestens Delphi 10 Seattle reproduzieren (simples Konsolenprogramm). Ältere Versionen habe ich gerade nicht zur Hand.

Mach doch bitte einen BugReport dazu auf.

KodeZwerg 15. Aug 2022 13:25

AW: Delphi und FPC compiler problem
 
Delphi-Quellcode:
//nicht ausprobiert da ich eigentlich nichts erstellen wollte
{$IF not Declared(FPC_VERSION)}
  const FPC_VERSION = 0;
{$IFEND}

// funktioniert nicht, der selbe fehler bei prüfung auf >= 3
{$IFDEF FPC}
  {$IF Declared(FPC_VERSION)}  <<<<<<<<<<<<<<<<<<<<<< Declared, nicht Defined
    {$IF FPC_VERSION >= 3}
      {$DEFINE UNICODE}
    {$IFEND FPC_VERSION}
  {$IFEND FPC_VERSION}
{$ENDIF FPC}


// funktioniert
{$IF Defined(FPC) and Declared(FPC_VERSION) and (FPC_VERSION >= 3)}
  {$DEFINE UNICODE}
{$IFEND}

// funktioniert
{$IF Declared(FPC_VERSION) and (FPC_VERSION >= 3)}
  {$DEFINE UNICODE}
{$IFEND}
ich bin halt davon ausgegangen das mein "IF FPC THEN" ausreicht um Delphi da auszugrenzen.

Vielen Dank an euch allen!!

getestet mit Turbo Delphi 2006, Delphi Rio und FPC 3.x

Rolf Frei 15. Aug 2022 13:27

AW: Delphi und FPC compiler problem
 
Das ist ein reines Compilier/Parser Problem und nicht ein Compilat Problem. Allfälliger Code innerhalb des IFDEF FPC wird ncht in das Programm compiliert. Das ist alles richtig und macht er auch so. Mit meinem obigen Lösungsansatz kannst du nach dem IFDEF FPC Müll reinschreiben und alles compiliert wie es sollte. Der Müll wird wie erwartet ignoriert.

Der Compiler wertet aber alle {$...} Zeilen aus, auch solche die er garnicht müsste. Da dort nun aber eine Referenz auf eine Konstante gemacht wird (FPC_VERSION >= 3) weiss der Delphi Compiler nicht was er damit anfangen soll, da er kein FPC_VERSION kennt. Ob da nun Defined oder Declared steht, hat für diesen Fehler keinen Einfluss, da dieser Teil eh nicht ins Compilat kommt.

@Uwe Raabe
Hab es eben mit D7 getestet und auch da kommt der Fehler aus gleichen Gründen. Wenn man da im IF einen Vergleich macht muss die entsprechende Konstante vorhanden sein, sonst knallt es.

Wie gesagt ist das ein reines Parser Problem und der Compiler macht da alles wie er muss, achtet also nicht auf das Zeugs innerhlab der IFDEF FPC beim compilieren. Für mich schaut das nicht wirklich nach einem Bug aus, sondern ist vermutlich "As Designed".

KodeZwerg 15. Aug 2022 13:38

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von mytbo (Beitrag 1510147)
Wenn ich mich richtig erinnere, verwendest du mORMot. Dann könnte die mormot.defines.inc eine Option für dich sein.

Bis bald...
Thomas

Das ist korrekt aber nicht in dieser Datei :D
Anfangs hatte ich die "Jedi.inc" verwendet aber die macht was ganz blödes unter FPC, da setzt die Datei ohne zu fragen einfach den {$MODE}, eher sub-optimal :D

Uwe Raabe 15. Aug 2022 13:42

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von Rolf Frei (Beitrag 1510151)
Für mich schaut das nicht wirklich nach einem Bug aus, sondern ist vermutlich "As Designed".

Ich habe das mal in einen internen Channel gepostet. Mal abwarten wie die Reaktionen da ausfallen.

KodeZwerg 15. Aug 2022 13:48

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von Rolf Frei (Beitrag 1510151)
Das ist ein reines Compilier/Parser Problem und nicht ein Compilat Problem. Allfälliger Code innerhalb des IFDEF FPC wird ncht in das Programm compiliert. Das ist alles richtig und macht er auch so. Mit meinem obigen Lösungsansatz kannst du nach dem IFDEF FPC Müll reinschreiben und alles compiliert wie es sollte. Der Müll wird wie erwartet ignoriert.

Der Compiler wertet aber alle {$...} Zeilen aus, auch solche die er garnicht müsste. Da dort nun aber eine Referenz auf eine Konstante gemacht wird (FPC_VERSION >= 3) weiss der Delphi Compiler nicht was er damit anfangen soll, da er kein FPC_VERSION kennt. Ob da nun Defined oder Declared steht, hat für diesen Fehler keinen Einfluss, da dieser Teil eh nicht ins Compilat kommt.

@Uwe Raabe
Hab es eben mit D7 getestet und auch da kommt der Fehler aus gleichen Gründen. Wenn man da im IF einen Vergleich macht muss die entsprechende Konstante vorhanden sein, sonst knallt es.

Wie gesagt ist das ein reines Parser Problem und der Compiler macht da alles wie er muss, achtet also nicht auf das Zeugs innerhlab der IFDEF FPC beim compilieren. Für mich schaut das nicht wirklich nach einem Bug aus, sondern ist vermutlich "As Designed".

Ich vermute es ist so wie Du sagst, wenn es in mehr als zwei Zeilen kommt, ignoriert der Parser das vorige statement und sammelt daten die er vermutlich nicht brauchen wird aber denn nach Korrektheit auswertet.
Dank für diesen Beitrag!

himitsu 15. Aug 2022 14:02

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von Rolf Frei (Beitrag 1510151)
Für mich schaut das nicht wirklich nach einem Bug aus, sondern ist vermutlich "As Designed".

Ein Bug ist es ja dennoch.
Man macht ja extra ein IF/IFDEF drumrum, damit der Teil darin nicht beachtet wird, wenn man schon weiß, dass es das nicht gibt.

Wenn der Compiler/Parser nun dennoch da rein sieht, dann ist es sein Problem.

Wenn er es sich dennoch ansehen will/muß, und er von einem vorherrigen IF/IFDEF bereits weiß, dass der Teil garnicht benutzt wird, dann sollte er zumindestens die "Prüfbedingungung" bis zum abschließenden } ignorieren.



Ich vermute es geht darauf hinaus, seitdem Delphi IFEND und ENDIF als "gleich" betrachtet, bzw. krankhaft zwanghaft versucht ALLES auf Eines umzubiegen,
und seitdem auch die Dinge drinen parsen muß, um das "richtige" Ende zu finden.

Früher war es einfach, alles vom IFDEF bis zum "nächsten" ENDIF oder ELSE und IF/IFEND wurde ignoriert.
Ging ja ursprünglich auch nicht anders, weil damals die "alten" Compiler $IF noch garnicht kannten.
Delphi-Quellcode:
{$IFDEF ConditionalDefines}
  {$IF ...}

  {$IFEND}
{$ENDIF}

Uwe Raabe 15. Aug 2022 14:16

AW: Delphi und FPC compiler problem
 
Die erste Reaktion war diese Schreibweise, die ja auch schon von Frank in die Runde geworfen wurde:
Delphi-Quellcode:
{$IFDEF FPC}
  {$IF Declared(FPC_VERSION) and (FPC_VERSION >= 3)}
    {$DEFINE UNICODE}
  {$IFEND}
{$ENDIF FPC}

Rolf Frei 15. Aug 2022 14:39

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von himitsu (Beitrag 1510160)
Ich vermute es geht darauf hinaus, seitdem Delphi IFEND und ENDIF als "gleich" betrachtet, bzw. krankhaft zwanghaft versucht ALLES auf Eines umzubiegen,
und seitdem auch die Dinge drinen parsen muß, um das "richtige" Ende zu finden.

Das Problem besteht seit Anfang an, seit es die IF Anweisung gibt, die Defines und Konstanten auswerten kann. Wie ich bereits gschrieben habe, geht das auch in D7 nicht und verhält sich da genau geleich. Mit deiner erwähnten Änderung hat das wohl nichts zu tun.

@Uwe Raabe
Ok das finde ich dann sogar eine elegante Lösung für das Problem.

KodeZwerg 15. Aug 2022 18:44

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1510149)
Mach doch bitte einen BugReport dazu auf.

Conditional Compiling dont work as expect - erledigt, hoffe alles korrekt gemacht zu haben.

himitsu 15. Aug 2022 20:14

AW: Delphi und FPC compiler problem
 
Witzig, eigentlich nutzte ich gern AND und OR, weil dutzendfach verschachteltete IFDEFs nicht grade schön anzusehen sind und man oft genug garnicht mehr erkennt, was wann wo ist.

z.B. viele mehrfach verschachtelte Dinge aus den INCs von Indy, JEDI und Co., lassen sich oftmals durch wenige IF+ELSEIF ersetzen.


Und jetzt ist es plötzlich die Lösung für etwas, was mir so bisher noch garnicht aufgefallen war. :shock:

KodeZwerg 15. Aug 2022 22:28

AW: Delphi und FPC compiler problem
 
Zitat:

Zitat von himitsu (Beitrag 1510160)
Ich vermute es geht darauf hinaus, seitdem Delphi IFEND und ENDIF als "gleich" betrachtet, bzw. krankhaft zwanghaft versucht ALLES auf Eines umzubiegen,
und seitdem auch die Dinge drinen parsen muß, um das "richtige" Ende zu finden.

Früher war es einfach, alles vom IFDEF bis zum "nächsten" ENDIF oder ELSE und IF/IFEND wurde ignoriert.
Ging ja ursprünglich auch nicht anders, weil damals die "alten" Compiler $IF noch garnicht kannten.
Delphi-Quellcode:
{$IFDEF ConditionalDefines}
  {$IF ...}

  {$IFEND}
{$ENDIF}

Delphi-Quellcode:
{$LEGACYIFEND ON}
ändert leider nichts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz