![]() |
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:
Kann mir bitte jemand helfen :angel:
{$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} |
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} |
AW: Delphi und FPC compiler problem
Nee, wozu?
Delphi-Quellcode:
fängt ja ab, falls es das nicht gibt. (in einem uralten FPC)
{$IF Defined(FPC_VERSION)}
Und bereits
Delphi-Quellcode:
passt auf, dass es im Delphi garnicht ausgeführt wird. :stupid:
{$IFDEF FPC}
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:
entspricht dem
{$IF Defined(FPC_VERSION)}
Delphi-Quellcode:
.
{$IFDEF FPC_VERSION}
Delphi-Quellcode:
also
{$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}
Delphi-Quellcode:
ConditionalExpressions {$IF} sollten ja inzwischen alle Compiler seit Jahrzehnten können.
{$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} |
AW: Delphi und FPC compiler problem
Zitat:
|
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:
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. |
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 |
AW: Delphi und FPC compiler problem
Das sieht schwer nach einem Bug aus und hat eine gewisse Ähnlichkeit mit
![]() 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. |
AW: Delphi und FPC compiler problem
Delphi-Quellcode:
ich bin halt davon ausgegangen das mein "IF FPC THEN" ausreicht um Delphi da auszugrenzen.
//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} Vielen Dank an euch allen!! getestet mit Turbo Delphi 2006, Delphi Rio und FPC 3.x |
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". |
AW: Delphi und FPC compiler problem
Zitat:
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. |
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