Bedingte Compilierung (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Delphi-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 Delphi-Compilern unterstützt).
  • Fügen Sie das Symbol auf der Seite Projekt > Optionen > Delphi-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 Delphi-Bezeichner durchgeführt werden. {$IFOPT} compiliert oder unterdrückt Code abhängig vom Status einer bestimmten Compiler-Option.

Das folgende Delphi-Codefragment wird beispielsweise je nachdem, ob die konditionale Definition DEBUG ({$DEFINE DEBUG}) festgelegt 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 Delphi-Bezeichner und können daher nicht im eigentlichen Programmcode verwendet werden. Entsprechend können Delphi-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 erzeugen, wird der Quellcode in nicht geänderten Units nicht berücksichtigt. Wählen Sie Projekt > Alle Projekte erzeugen, damit in allen Dateien des Projekts der aktuelle Status der bedingten Symbole verwendet wird.

Hinweis: Wenn Sie den Namen einer konditionale Definition in Projekt > Optionen > Delphi-Compiler ändern, müssen Sie Ihr Projekt (Projekt > <Projektname> erzeugen oder Umschalt + F9) erzeugen, damit die Änderungen wirksam werden.

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 DCC32   DCC64  
  Seit XE2  
  DCCOSX  
  Seit XE2  
  DCCIOSARM  
  Seit XE3  
  DCCIOS32  
  Seit XE3  
  DCCAARM  
In XE5
  DCCIOSARM64  
  Seit XE8  
Bemerkungen
Compiler DCC DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT
VER320

Eine Liste der Compiler-Versionen finden Sie unter Compiler-Versionen.
DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Für Delphi XE8, Compiler-Version 29.0, ist VER320 definiert.
Plattform CONSOLE DEFINIERT 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 Definiert, wenn die Zielplattform iOS ist.
*Neu* in XE4/iOS
NATIVECODE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Delphi.Net
MSWINDOWS DEFINIERT DEFINIERT Nicht 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 Nicht definiert Zielplattform ist die native 32-Bit-Windows-Plattform.
WIN64 Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Zielplattform ist 64-Bit-Windows.
*Neu* in XE2/x64
MACOS Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Nicht definiert DEFINIERT Zielplattform ist OS X.

*Neu* in XE2/OSX
MACOS32 Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Nicht definiert Nicht definiert Zielplattform ist 32-Bit-OS X.

*Neu* in XE2/OSX
MACOS64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Zielplattform ist 64-Bit-OS X.

*Neu* in XE8/OSX
LINUX Nicht definiert 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 Nicht definiert Seit Kylix
POSIX Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix
POSIX32 Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix
ANDROID Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Definiert, wenn die Zielplattform Android ist.


*Neu* in XE5

CPU CPUARM Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT DEFINIERT Definiert, wenn die CPU auf der ARM-Architektur basiert, wie der mobile Delphi-Compiler für das iOS-Gerät (DCCIOSARM.EXE).
*Neu* in XE4/iOS
CPU386 DEFINIERT Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht 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 Nicht definiert CPU ist ein Intel 386-Prozessor oder höher auf einer beliebigen Plattform.
  • Neu* in XE2/x64
CPUX64 Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Die CPU unterstützt den x86-64-Befehlssatz und befindet sich in einer 64-Bit-Umgebung.
*Neu* in XE2/x64
CPU32BITS DEFINIERT Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT Nicht definiert Die CPU befindet sich in einer 32-Bit-Umgebung, wie z. B. DCC32.EXE.
*Neu* in XE8
CPU64BITS Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Die CPU befindet sich in einer 64-Bit-Umgebung, wie z. B. DCC64.EXE.
*Neu* in XE8
CPUARM32 Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Die CPU befindet sich in einer 32-Bit-ARM-Umgebung, wie z. B. DCCIOSARM.EXE.
*Neu* in XE8
CPUARM64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Die CPU befindet sich in einer 64-Bit-ARM-Umgebung, wie z. B. DCCIOSARM64.EXE.
*Neu* in XE8
Verfügbarkeit
ALIGN_STACK Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht 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. Weitere Informationen finden Sie im Blog von Eli Boling unter http://blogs.embarcadero.com/eboling/2009/05/20/5607 (EN).
*Neu* in XE2/OSX
ASSEMBLER DEFINIERT DEFINIERT DEFINIERT Nicht definiert DEFINIERT Nicht definiert Nicht definiert Assembler-Syntax wird akzeptiert.
AUTOREFCOUNT Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT Definiert für Compiler, die die automatische Referenzzählung verwenden, wie die mobilen Delphi-Compiler.
*Neu* in XE4/iOS
EXTERNALLINKER Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT DEFINIERT Definiert für Compiler, die über einen externen Linker und den LLVM-Codegenerator verfügen; die mobilen Delphi-Compiler haben den externen ID-Linker und verwenden LLVM als Codegenerator.
*Neu* in XE4/iOS
UNICODE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT UNICODE ist als Standard-String-Typ definiert.
CONDITIONALEXPRESSIONS DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Testet auf die Verwendung der $IF -Direktive.
ELF Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht 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 Definiert für Compiler (wie die mobilen Delphi-Compiler), die Sprach-Features der "nächsten Generation" verwenden, wie 0-basierte Strings.
*Neu* in XE4/iOS
PC_MAPPED_EXCEPTIONS Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht 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).
*Neu* in XE2.
PIC Nie Nie DEFINIERT, wenn -P angegeben ist Nie DEFINIERT, wenn -P angegeben ist Immer definiert Nie 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 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).
*Neu* in XE4/iOS
WEAKREF DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Definiert für Compiler, die schwache Referenzen verwenden können (das Attribut [weak]).
*Neu* in XE4/iOS
WEAKINSTREF Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Instanzen definiert sind.
*Neu* in XE4/iOS
WEAKINTFREF DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Interfaces definiert sind.
*Neu* in XE4/iOS

In den Spaltenüberschriften der Tabelle ist:

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 >= 17.0}
      {$DEFINE HAS_INLINE}
    {$IFEND}
    {$IF RTLVersion >= 14.0}
      {$DEFINE HAS_ERROUTPUT}
    {$IFEND}
 {$ENDIF}

Eine Liste der Versionsnummern der verschiedenen Delphi-Compiler finden Sie unter Tabelle der Compiler-Versionen.

Vordefinierte Konstanten

Konstanten sind oft leistungsfähiger als Bedingungen, weil Sie Konstanten in Delphi-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 legt die Version der Laufzeitbibliothek fest. RTLVersion für Tokyo ist 32.
  • Die Konstante System.CompilerVersion legt die Version des aktuellen Delphi-Compilers fest. CompilerVersion für Tokyo ist 32.
  • Die Konstante FMX.Types.FireMonkeyVersion legt die Version der aktuellen FireMonkey-Bibliothek fest. FireMonkeyVersion für Tokyo ist 250.

Siehe auch