Bedingte Compilierung (Delphi)
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.
Inhaltsverzeichnis
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 | |
VER300 Eine Liste der Compiler-Versionen finden Sie unter Compiler-Versionen. |
DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | Für Delphi Seattle ist die Compiler-Version VER300 .
| |
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 | Nicht definiert | Zielplattform ist Mac OS X. *Neu* in XE2/OSX | |
MACOS32 | Nicht definiert | Nicht definiert | DEFINIERT | DEFINIERT | DEFINIERT | Nicht definiert | Nicht definiert | Zielplattform ist 32-Bit-Mac OS X. *Neu* in XE2/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 | Nicht definiert | Nicht definiert | Nicht 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 | Nicht definiert | Nicht definiert | Nicht 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:
- DCC32 der Delphi-Compiler für 32-Bit-Windows.
- DCC64 der Delphi-Compiler für 64-Bit-Windows.
- DCCOSX der Delphi-Compiler für Mac OS X.
- DCCIOSARM der Delphi-Compiler für 32-Bit-iOS-Geräte.
- DCCIOS32 der Delphi-Compiler für iOS-Simulatoren.
- DCCAARM.EXE der Delphi-Compiler für Android-Geräte.
- DCCIOSARM64 der Delphi-Compiler für 64-Bit-iOS-Geräte.
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 Seattle ist 30.
- Die Konstante System.CompilerVersion legt die Version des aktuellen Delphi-Compilers fest. CompilerVersion für Seattle ist 30.
- Die Konstante FMX.Types.FireMonkeyVersion legt die Version der aktuellen FireMonkey-Bibliothek fest. FireMonkeyVersion für Seattle ist 23.
Siehe auch
- Liste der Delphi-Compiler-Direktiven - Index
- Compiler-Versionen
- CompilerVersion_(Delphi) Codebeispiel
- IF-Direktive (Delphi) und IFEND-Direktive (Delphi)
- IFDEF-Direktive (Delphi) und ENDIF-Direktive (Delphi)
- Deklarationen und Anweisungen
- Delphi-Compiler
- Delphi-Compiler (Seite in den Projektoptionen)