Anzeigen: Object Pascal C++
Anzeigeeinstellungen

Bedingte Compilierung (Object Pascal)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Object Pascal-Compiler-Direktiven - Index

Die bedingte Compilierung basiert auf dem Vorhandensein und der Auswertung von Konstanten, dem Status der Compiler-Optionen und der Definition bedingter Symbole.

Bedingte Symbole arbeiten wie boolesche Variablen: Sie sind entweder definiert (True) oder nicht definiert (False). Jedes gültige bedingte Symbol wird bis zu seiner Definition als False ausgewertet.

Sie können eine Bedingung auf die folgenden Arten definieren:

  • Mit der Direktive {$DEFINE}, um ein bestimmtes Symbol auf True zu setzen, und mit der Direktive {$UNDEF}, um das Symbol auf False zu setzen.
  • Mit der Option -D für den Befehlszeilen-Compiler (diese Option wird von allen Object Pascal-Compilern unterstützt).
  • Fügen Sie das Symbol auf der Seite Projekt > Optionen > Object Pascal-Compiler dem Feld Bedingungen hinzu.

Die bedingten Direktiven {$IFDEF}, {$IFNDEF}, {$IF}, {$ELSEIF}, {$ELSE}, {$ENDIF} und {$IFEND} ermöglichen das Compilieren oder Unterdrücken von Code auf Basis des Status eines bedingten Symbols. Mit {$IF} und {$ELSEIF} kann die bedingte Compilierung auf Basis deklarierter Object Pascal-Bezeichner durchgeführt werden. {$IFOPT} compiliert oder unterdrückt Code abhängig vom Status einer bestimmten Compiler-Option.

Das folgende Object Pascal-Codefragment wird beispielsweise je nachdem, ob die konditionale Definition DEBUG ({$DEFINE DEBUG}) gesetzt ist, unterschiedlich verarbeitet:

 
   {$DEFINE DEBUG}
  	{$IFDEF DEBUG}
  	Writeln('Debug is on.');  // This code executes.
  	{$ELSE}
  	Writeln('Debug is off.');  // This code does not execute.
  	{$ENDIF}
  	{$UNDEF DEBUG}
  	{$IFNDEF DEBUG}
  	Writeln('Debug is off.');  // This code executes.
  	{$ENDIF}
Hinweis: Bedingte Symbole sind keine Object Pascal-Bezeichner und können daher nicht im eigentlichen Programmcode verwendet werden. Entsprechend können Object Pascal-Bezeichner nicht in bedingten Direktiven außer in {$IF} und {$ELSEIF} angegeben werden.
Hinweis: Bedingte Symbole werden nur ausgewertet, wenn der Quellcode neu compiliert wird. Wenn Sie den Status eines bedingten Symbols ändern und das Projekt anschließend neu erstellen, wird der Quellcode in nicht geänderten Units nicht berücksichtigt. Wählen Sie die Option Projekt > Alle Projekte erzeugen, damit in allen Dateien des Projekts der geänderte Status verwendet wird.

Direktiven zur bedingten Compilierung können bis zu 32 Ebenen tief verschachtelt werden. Für jedes {$IFxxx} muss das zugehörige {$ENDIF} oder {$IFEND} in derselben Quellcodedatei definiert sein. Bedingte Symbole müssen mit einem Buchstaben beginnen, auf den eine beliebige Kombination aus Buchstaben, Ziffern und Unterstrichen folgen kann. Bedingte Symbole können zwar beliebig lang sein, signifikant sind aber nur die ersten 255 Zeichen.

Vordefinierte Bedingungen

Die folgenden bedingten Standardsymbole sind definiert:

Kategorie Symbol Win32   Win64   Mac OS X   iOS-Gerät   iOS-Simulator   Android Bemerkungen
Compiler DCC DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT
VER280

Eine Liste der Compiler-Versionen finden Sie unter Compiler-Versionen.
DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT
Plattform CONSOLE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Ist definiert, wenn eine Anwendung als Konsolenanwendung compiliert wird.
IOS Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT N/V Definiert, wenn die Zielplattform iOS ist.
NATIVECODE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Object Pascal.Net
MSWINDOWS DEFINIERT DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Bezeichnet das Betriebssystem Windows. Verwenden Sie MSWINDOWS, um auf eine beliebige Windows-Plattform anstelle von WIN32 zu testen.
WIN32 DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Zielplattform ist die native 32-Bit-Windows-Plattform.
WIN64 Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Zielplattform ist 64-Bit-Windows.
MACOS Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Nicht definiert Zielplattform ist Mac OS X.
MACOS32 Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Nicht definiert Zielplattform ist 32-Bit-Mac OS X.
LINUX Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Seit Kylix
LINUX32 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Seit Kylix
POSIX Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix
POSIX32 Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix
ANDROID Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Definiert, wenn die Zielplattform Android ist.
CPU CPUARM Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Definiert, wenn die CPU auf der ARM-Architektur basiert, wie die mobilen Object Pascal-Compiler für das iOS-Gerät (DCCIOSARM.EXE).
CPU386 DEFINIERT Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Gibt an, dass Intel 386 (oder höher) als CPU verwendet wird.
CPUX86 DEFINIERT Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert CPU ist ein Intel 386-Prozessor oder höher auf einer beliebigen Plattform.
CPUX64 Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Die CPU befindet sich in einer 64-Bit-Umgebung, wie z. B. DCC64.EXE.
Verfügbarkeit
ALIGN_STACK Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Definiert in Code, der mit dem OS X-Compiler und einem weiteren Compiler auf einer anderen Plattform genutzt werden kann, wie z. B. Linux, das keine strengen Anforderungen für die Stack-Ausrichtung hat.
ASSEMBLER DEFINIERT DEFINIERT DEFINIERT Nicht definiert DEFINIERT Nicht definiert Assembler-Syntax wird akzeptiert.
AUTOREFCOUNT Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert für Compiler, die die automatische Referenzzählung verwenden, wie die mobilen Object Pascal-Compiler.
EXTERNALLINKER Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Definiert für Compiler, die einen externen Linker und den LLVM-Code-Generator haben; die mobilen Object Pascal-Compiler verfügen über den externen ID-Linker und verwenden LLVM als Code-Generator.
UNICODE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT UNICODE ist als Standard-String-Typ definiert.
CONDITIONALEXPRESSIONS DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Testet auf die Verwendung der $IF-Direktive.
ELF Nicht definiert Nicht definiert Nicht definiert +DEFINIERT+ Nicht definiert Nicht definiert Definiert für ausführbare und linkbare Dateien (Executable and Linkable Format, ELF).
NEXTGEN Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert für Compiler (wie die mobilen Object Pascal-Compiler), die Sprach-Features der "nächsten Generation" verwenden, wie 0-basierte Strings.
PC_MAPPED_EXCEPTIONS Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Definiert bei der Compilierung auf einer Plattform oder für eine Zielplattform, die mit Adresszuordnungen anstelle von Stack-Frames Exceptions abwickelt (wie z. B. OS X).
PIC Nie Nie DEFINIERT, wenn -P angegeben ist Nie DEFINIERT, wenn -P angegeben ist Immer definiert Definiert für Plattformen, die PIC (Position-Independent Code) erfordern, wie z. B. OS X.
UNDERSCOREIMPORTNAME DEFINIERT Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Definiert für Compiler, die einen führenden Unterstrich hinzufügen (z. B. in Namen von dynamischen Bibliotheken, die aus dem Mac-Betriebssystem importiert werden).
WEAKREF Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert für Compiler, die schwache Referenzen verwenden können (das Attribut [weak]).
WEAKINSTREF Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Instanzen definiert sind.
WEAKINTREF Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Interfaces definiert sind.


Verwenden von Bedingungen für die Compiler-Version

Um beispielsweise die Version des Compilers oder der Laufzeitbibliothek zu ermitteln, mit der Ihr Quelltext compiliert wurde, können Sie {$IF} mit den Konstanten CompilerVersion, RTLVersion und weiteren verwenden:

 
  {$IFDEF CONDITIONALEXPRESSIONS}
     {$IF CompilerVersion >= 19.5}
       {$DEFINE HAS_INLINE}
     {$IFEND}
     {$IF RTLVersion >= 20.0}
       {$DEFINE HAS_ERROUTPUT}
     {$IFEND}
  {$ENDIF}


Vordefinierte Konstanten

Konstanten sind oft leistungsfähiger als Bedingungen, weil Sie Konstanten in Object Pascal-Code programmseitig einsetzen können. Bedingungen dagegen werden nur innerhalb von bedingten Compiler-Direktiven, wie {$IF} und {$IFDEF}, akzeptiert.

Es sind drei wichtige Konstanten verfügbar:

  • Die Konstante System.RTLVersion definiert die Version der Laufzeitbibliothek. RTLVersion ist 28 für Appmethod 1.15.
  • Die Konstante System.CompilerVersion definiert die Version des aktuellen Object Pascal-Compilers. CompilerVersion ist 28 für Appmethod 1.15.
  • Die Konstante FMX.Types.FireMonkeyVersion definiert die Version der aktuellen FireMonkey-Bibliothek. FireMonkeyVersion ist 21.0 für Appmethod 1.15.

Siehe auch

Meine Werkzeuge
In anderen Sprachen