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}
{$IF}
und {$ELSEIF}
angegeben 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 | |
VER340 Eine Liste der Compiler-Versionen finden Sie unter Compiler-Versionen. |
DEFINED | DEFINED | DEFINED | DEFINED | DEFINED | DEFINED | DEFINED | DEFINED | DEFINED | Für Delphi Sydney, Compiler-Version 34.0 ist VER340 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.
| |
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.
| |
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.
| |
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.
| |
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.
| |
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.
| |
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.
| |
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.
| |
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).
|
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.
| |
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).
| |
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).
| |
WEAKREF | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | DEFINIERT | Definiert für Compiler, die schwache Referenzen verwenden können (das Attribut [weak] ).
| |
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.
|
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.
- DCCOSX64 ist der Delphi-Compiler für 64-Bit-macOS.
- DCCAARM der Delphi-Compiler für Android-Geräte.
- DCCIOSARM64 der Delphi-Compiler für 64-Bit-iOS-Geräte.
- DCCLINUX64 der Delphi-Compiler für 64-Bit-Linux.
- DCCAARM64 der Delphi-Compiler für 64-Bit-Android-Geräte.
- DCCOSXARM64 der Delphi-Compiler für die 64-Bit-macOS-Plattform.
- DCCIOSSIMARM64 ist der Delphi-Compiler für den ARM-iOS-Simulator, 64 Bit.
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 Sydney ist 34.
- Die Konstante System.CompilerVersion legt die Version des aktuellen Delphi-Compilers fest. CompilerVersion für Sydney ist 34.
- Die Konstante FMX.Types.FireMonkeyVersion legt die Version der aktuellen FireMonkey-Bibliothek fest. FireMonkeyVersion für Sydney ist 270.
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)
- Delphi-Compiler
- Delphi-Compiler (Seite in den Projektoptionen)