Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 1 von 2  1 2      

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