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 bedingten Definition in Projekt > Optionen > Delphi-Compiler ändern, müssen Sie Ihr Projekt erzeugen (Projekt > <Projektname> erzeugen oder Umschalt + F9), 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
DCCOSX64
Seit 10.3 Rio Release 2
DCCAARM
In XE5
DCCIOSARM64
Seit XE8
DCCLINUX64
Seit 10.2 Tokyo
DCCAARM64
Seit 10.3 Rio Release 3
DCCOSXARM64
Seit 11.0 Alexandria-Release
DCCIOSSIMARM64
Seit 11.2 Alexandria-Release
Kommentare
Compiler DCC DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED
VER350
Eine Liste der Compiler-Versionen finden Sie unter Compiler-Versionen.
DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED DEFINED Für Delphi Alexandria, Compiler-Version 35.0 ist VER350 definiert.
Plattform CONSOLE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Ist definiert, wenn eine Anwendung als Konsolenanwendung compiliert wird.
IOS Nicht definiert Nicht definiert Nicht definiert N/V DEFINIERT Nicht definiert Nicht definiert Nicht definiert DEFINIERT Definiert, wenn die Zielplattform iOS ist.
*Neu* in XE4/iOS
IOS64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert DEFINIERT Definiert, wenn die Zielplattform iOS64 ist.
Seit XE8/iOSarm64
OSX Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Definiert, wenn die Zielplattform macOS ist.
*Neu* in XE2/macOS.
OSX64 Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Definiert, wenn die Zielplattform macOS ist.
*Neu* in 10.3.2.
NATIVECODE DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Delphi.Net
MSWINDOWS DEFINIERT DEFINIERT Nicht definiert Nicht 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 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 Nicht definiert Nicht definiert Zielplattform ist 64-Bit-Windows.
  • Neu* in XE2/x64
MACOS Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Nicht definiert DEFINIERT DEFINIERT Zielplattform ist ein Apple Darwin-Betriebssystem (macOS oder iOS).
Hinweis: Dieses Symbol war vorhanden, bevor Apple den Namen von OS X in macOS geändert hat.
*Neu* in XE2/macOS.
MACOS32 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Zielplattform ist ein Apple Darwin-32-Bit-Betriebssystem (32-Bit-macOS oder 32-Bit-iOS).
Hinweis: Dieses Symbol war vorhanden, bevor Apple den Namen von OS X in macOS geändert hat.
*Neu* in XE2/macOS.
MACOS64 Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT Nicht definiert Nicht definiert DEFINIERT DEFINIERT Zielplattform ist ein Apple Darwin-64-Bit-Betriebssystem (64-Bit-macOS oder 64-Bit-iOS).
Hinweis: Dieses Symbol war vorhanden, bevor Apple den Namen von OS X in macOS geändert hat.
*Neu* in XE8/macOS.
LINUX Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Seit Kylix.
LINUX32 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Seit Kylix.
LINUX64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Neu in 10.2
POSIX Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix.
POSIX32 Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Seit Kylix.
POSIX64 Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Seit Kylix.
ANDROID Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Definiert, wenn die Zielplattform Android ist.


*Neu* in XE5

ANDROID32 Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Seit XE8/iOSarm64.
ANDROID64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Delphi-Compiler für die Android-64-Bit-Plattform.


*Neu* in 10.3.3

CPU CPU386 DEFINIERT Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Gibt an, dass Intel 386 (oder höher) als CPU verwendet wird.
CPUX86 DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht 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 DEFINIERT Nicht definiert Nicht definiert 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 Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Die CPU befindet sich in einer 32-Bit-Umgebung, wie z. B. DCC32.EXE.
  • Neu* in XE8
CPU64BITS Nicht definiert DEFINIERT DEFINIERT Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Die CPU befindet sich in einer 64-Bit-Umgebung, wie z. B. DCC64.EXE.
  • Neu* in XE8
CPUARM Nicht definiert Nicht definiert Nicht definiert DEFINIERT DEFINIERT Nicht definiert DEFINIERT DEFINIERT DEFINIERT Definiert, wenn die CPU auf der ARM-Architektur basiert.
*Neu* in XE4/iOS.
CPUARM32 Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Die CPU befindet sich in einer 32-Bit-ARM-Umgebung.
*Neu* in XE8.
CPUARM64 Nicht definiert Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT 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 Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Definiert in Code, der mit dem macOS-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/macOS
ASSEMBLER DEFINIERT DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Assembler-Syntax wird akzeptiert.
AUTOREFCOUNT (*) Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT Nicht definiert DEFINIERT bei 10.2.
Nicht definiert ab 10.3.
Nicht definiert Nicht definiert Definiert für Compiler, die die automatische Referenzzählung verwenden, wie die mobilen Delphi-Compiler.
*Neu* in XE4/iOS. In 10.4 Sydney entfernt
EXTERNALLINKER Nicht definiert Nicht definiert DEFINIERT DEFINIERT DEFINIERT DEFINIERT 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 DEFINED DEFINIERT UNICODE ist als Standard-String-Typ definiert.
CONDITIONALEXPRESSIONS DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINED DEFINIERT Testet auf die Verwendung der $IF -Direktive.
ELF Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert 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 DEFINIERT DEFINIERT DEFINIERT DEFINIERT bei 10.2.
Nicht definiert ab 10.3.
Nicht definiert Nicht definiert Nicht 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. In 10.4 Sydney entfernt
PC_MAPPED_EXCEPTIONS Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht 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. macOS).
  • Neu* in XE2
PIC Nie Nie Immer DEFINIERT Immer DEFINIERT Immer DEFINIERT Immer DEFINIERT Immer DEFINIERT Immer DEFINIERT Immer DEFINIERT Definiert für Plattformen, die PIC (Position-Independent Code) erfordern, wie z. B. macOS.
UNDERSCOREIMPORTNAME DEFINIERT Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht definiert Nicht 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 DEFINIERT Definiert für Compiler, die schwache Referenzen verwenden können (das Attribut [weak]).
  • Neu* in XE4/iOS
WEAKINSTREF (*) DEFINIERT DEFINIERT Nicht definiert Nicht definiert Nicht definiert DEFINIERT Nicht definiert DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Instanzen definiert sind.
*Neu* in XE4/iOS. In 10.4 Sydney entfernt
WEAKINTFREF DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT DEFINIERT Definiert, wenn schwache Referenzen für Interfaces definiert sind.
  • Neu* in XE4/iOS


Achtung: Die Symbole mit einem Sternchen (*) wurden in der Vergangenheit für mobile Delphi-Compiler definiert, wurden jedoch in RAD Studio 10.4 Sydney im Rahmen der Entfernung des ARC-Speichermodells entfernt.

In den Spaltenüberschriften der Tabelle ist:

Bedingte Framework-Variablen

Die folgenden Bedingungen sind ab RAD Studio 11.1 verfügbar:

Kategorie Symbol Kommentare
Framework FRAMEWORK_VCL Definiert, wenn das Projekt das VCL-Framework verwendet.
FRAMEWORK_FMX Definiert, wenn das Projekt das FMX-Framework verwendet.

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 Alexandria ist 35.
  • Die Konstante System.CompilerVersion legt die Version des aktuellen Delphi-Compilers fest. CompilerVersion für Alexandria ist 35.
  • Die Konstante FMX.Types.FireMonkeyVersion legt die Version der aktuellen FireMonkey-Bibliothek fest. FireMonkeyVersion für Alexandria ist 280.

Siehe auch