Conditional compilation/de
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
Zurück zum Thema Verwendung von Bedingungen, Nachrichten und Makros.
Bedingte Compilierung
Die bedingte Compilierung bestimmt, welche Teile des Quellcodes in das fertige Programm aufgenommen werden.
Die bedingte Compilierung bestimmt, ob ein Abschnitt compiliert wird und damit Bestandteil des fertigen Programms wird.
Der Abschnitt, der nicht compiliert wird, wird auch nicht Bestandteil des fertigen Programms.
Die bedingte Compilierung basiert auf der Existenz (Vorhandensein) von Konstanten, dem Status von Compiler Direktiven und der Definition von selbst definierten Symbolen.
Selbst definierte Symbole
Selbst definierte Symbole gelten ab der Stelle ab der sie deklariert werden bis zu der Stelle an der ihre deklaration aufgehoben wird.
Wird die Deklaration der selbst definierten Symbole nicht aufgehoben, gilt die Deklaration der selbstdefinierten Symbole bis zum Ende der Unit.
Beispiel 1: Anlegen eines selbstdefinierten Symbols:
{$define MeinSymbol} // definiert ein Symbol
... // der Bereich, in dem das selbstdefinierte Symbol gültig ist
{$undef MeinSymbol} // hebt die Definition des Symbols wieder auf
Beispiel 2: Anlegen und abfragen eines selbstdefinierten Symbols:
...
{$define MeinSymbol} // definiert ein Symbol
...
{$ifdef MeinSymbol} // Fragt die Existenz des selbst definierten Symbols ab und compiliert den IF-Zweig
...;
{$else} // der Else-Zweig wird nicht compiliert
...;
{$endif}
...
{$undef MeinSymbol} // hebt die Definition des selbstdefinierten Symbols wieder auf,
// damit ist das selbstdefinierte Symbol nicht mehr vorhanden
...
Beispiel 3: Abfragen eines nicht vorhandenen selbstdefinierten Symbols:
// da das selbstdefinierte Symbol hier nicht definiert (vorhanden) ist, wird in diesem Fall der Sonst-Zweig (Else-Zweig) compiliert
// das heisst, wenn ein selbstdefiniertes Symbol nicht vorhanden ist, kommt vom Compiler keine Fehlermeldung
// und es wird soweit vorhanden der Else-Zweig compiliert, bzw. wenn der Else-Zweig nicht vorhanden ist wird nichts compiliert
...
{$ifdef MeinSymbol} // Fragt die Existenz des selbst definierten Symbols ab und compiliert den Else-Zweig
...;
{$else} // compiliert den Else-Zweig
...;
{$endif}
...
Beispiel 4: Abfragen, ob es sich um eine Intel/AMD 32/64Bit CPU handelt:
...
{$if defined(cpux86_64) or defined(cpux86)}
...; // Intel/AMD-CPU
{$else}
...; // Es ist keine PC-CPU, zB. ARM (Raspberry)
{$endif}
...
Vordefinierte Symbole
Vordefinierte Symbole (predefined symbols) werden im Gegensatz zu selbstdefinierten Symbolen vom Compiler erstellt.
Das Erstellen der vordefinierten Symbole (predefined symbols) hängt von bestimmten Bedingungen wie Compilereinstellung, Prozessor usw. ab.
Das heißt, das nicht alle vordefinierten Symbole gleichzeitig existieren (vorkommen) können.
Vordefinierte Symbole (predefined symbols) gelten im Gegensatz zu selbstdefinierten Symbolen global, d. h. sie gelten für das gesamte Programm.
Vordefinierte Symbole (predefined symbols) werden wie selbstdefinerte Symbole verwendet.
Liste der vordefinieten Symbole:
Diese Symbole können beim compilieren vom Compiler definert werden.
Das heisst, das während des
Diese Liste vordefinierter Symbole werden möglicherweise beim compilieren gesetzt.
Das heisst, diese Symbole können möglicherweise nicht existieren (vorkommen).
Symbol | Beschreibung |
FPC_LINK_DYNAMIC | Das vordefinerte Symbol ist gesetzt, wenn das Programm mit dynamischem Linken erstellt wird. Das entspricht dem Compiler switch -XC. |
FPC_LINK_STATIC | Das vordefinerte Symbol ist gesetzt, wenn das Programm statisch gelinkt wird. Das ist die Standardeinstellung. |
FPC_LINK_SMART | Das vordefinerte Symbol ist gesetzt, wenn das Programm smart gelinkt wird. Das entspricht dem Compiler switch -XX |
FPC_PROFILE | Das vordefinerte Symbol ist gesetzt, wenn profiling code zum Programm hinzugefügt wird. Das entspricht dem Compiler switch -pg |
FPC_CROSSCOMPILING | Das vordefinerte Symbol ist gesetzt, wenn das Zielbetriebsystem festgelegt wurde. |
FPC | Das vordefinerte Symbol ist bei Free Pascal immer gesetzt. |
VER2 | Das vordefinerte Symbol ist bei Free Pascal Version 2.x.x immer gesetzt. |
VER2_0 | Das vordefinerte Symbol ist bei Free Pascal Version 2.0.x immer gesetzt. |
VER2_2 | Das vordefinerte Symbol ist bei Free Pascal Version 2.2.x immer gesetzt. |
FPC_VERSION | Enthält die Hauptversionsnummer von FPC. |
FPC_RELEASE | Enthält die Unterversionsnummer von FPC. |
FPC_PATCH | Enthält die Revisionsnummer von FPC. |
FPC_FULLVERSION | Enthält die vollständige Versionsnummer als Ganzzahl. Für FPC 2.6.0 ist der Wert 20600. |
ENDIAN_LITTLE | Das vordefinerte Symbol ist gesetzt, wenn das Ziel ein little-endian Prozessor ist(80x86, Alpha, ARM, MIPS little endian). Die Begriffe Little-Endian und Big-Endian bezeichnen bei Prozessoren die Speicherorganisation für einfache Zahlenwerte. |
ENDIAN_BIG | Das vordefinerte Symbol ist gesetzt, wenn das Ziel ein big-endian Prozessor ist (680x0, PowerPC, SPARC, MIPS big endian). Die Begriffe Little-Endian und Big-Endian bezeichnen bei Prozessoren die Speicherorganisation für einfache Zahlenwerte. |
FPC_DELPHI | Free Pascal arbeitet im Delphi-Modus. Das entspricht dem Compiler switch -MDelphi bzw. dem Compilermodus $MODE DELPHI) |
FPC_OBJFPC | Free Pascal arbeitet im OBJFPC-Modus. Das entspricht dem Compiler switch -Mobjfpc bzw. dem Compilermodus $MODE OBJFPC) |
FPC_TP | Free Pascal arbeitet im Turbopascal-Modus. Das entspricht dem Compiler switch -Mtp bzw. dem Compilermodus $MODE TP) |
FPC_GPC | Free Pascal arbeitet im GNU Pascal-Modus. Das entspricht dem Compiler switch -SP bzw. dem Compilermodus $MODE GPC) |
Folgende CPU-Typen können beim compilieren vom Compiler gesetzt werden.
Symbol | Beschreibung |
CPU86 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Intel80x86 oder kompatibler Prozessor ist. |
CPU87 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Intel80x87 oder kompatibler Prozessor ist. |
CPU386 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Intel386 oder ein späterer Prozessortyp ist. |
CPU68K | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Motorola 680x0 oder kompatibler Prozessor ist. |
CPUM68020 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Motorola 68020 oder ein späterer Prozessortyp ist. |
CPU68 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Motorola 680x0 oder kompatibler Prozessor ist. |
CPUSPARC32 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein SPARC v7 oder kompatibler Prozessor ist. |
CPUSPARC | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein SPARC v7 oder kompatibler Prozessor ist. |
CPUALPHA | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Alpha AXP oder kompatibler Prozessor ist. |
CPUPOWERPC | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 32-bit or 64-bit PowerPC oder kompatibler Prozessor ist. |
CPUPOWERPC32 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 32-bit PowerPC oder kompatibler Prozessor ist. |
CPUPOWERPC64 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 64-bit PowerPC oder kompatibler Prozessor ist. |
CPUX86 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein AMD64 oder Intel 32-bit Prozessor ist. |
CPUX86_64 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein AMD64 oder Intel 64-bit Prozessor ist. |
CPUAMD64 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein AMD64 oder Intel 64-bit Prozessor ist. |
CPUIA64 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein Intel Itanium 64-bit Prozessor ist. |
CPUARM | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein ARM 32-bit Prozessor ist. |
CPUAVR | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 8/16Bit AVR. |
CPU16 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 16-bit Prozessor ist. |
CPU32 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 32-bit Prozessor ist. |
CPU64 | Das vordefinerte Symbol ist gesetzt, wenn der Zielprozessor ein 64-bit Prozessor ist. |
Folgende Fliesskomma-Einheiten können beim compilieren vom Compiler gesetzt werden.
Symbol | Beschreibung |
FPUSOFT | Softwareemulation der Fliesskommaeinheit (betrifft alle CPU Typen). |
FPUSSE64 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine SSE64 FPU oder höher oder AMD64 ist. |
FPUSSE | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine SSE-Einheit auf einem Intel386 Prozessor und höher ist. |
FPUSSE2 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine SSE2-Einheit auf einem Intel386 Prozessor und höher ist. |
FPUSSE3 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine SSE3-Einheit auf einem Intel386 Prozessor und höher ist. |
FPULIBGCC | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine Emulation mittels GCC-Bibliothek auf einem ARM oder einem M86K Prozessor ist. |
FPU68881 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit ein 68881 aufeinem M68K Prozessor ist. |
FPUFPA | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine FPA auf einem ARM Prozessor ist. |
FPUFPA10 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine FPA 10 auf einem ARM Prozessorist. |
FPUFPA11 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine FPA 11 auf einem ARM Prozessor ist. |
FPUVFP | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine VFP auf einem ARM Prozessor ist. |
FPUX87 | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit eine x87 auf einem Intel386 Prozessor oder höher ist. |
FPUITANIUM | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit auf einem Intel Itanium Prozessor ist. |
FPUSTANDARD | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit auf einem PowerPC (32/64 bit) Prozessor ist. |
FPUHARD | Das vordefinerte Symbol ist gesetzt, wenn die Fliesskommaeinheit auf einem Sparc Prozessor ist. |
Folgende Betriebssystemsymbole können beim compilieren vom Compiler gesetzt werden.
Zielbetriebssystem | Symbol(e) |
linux | LINUX, UNIX |
freebsd | FREEBSD, BSD, UNIX |
netbsd | NETBSD, BSD, UNIX |
sunos | SUNOS, SOLARIS, UNIX |
go32v2 (Erweiterung für DOS) | GO32V2, DPMI |
os2 | OS2 |
emx (Erweiterung für DOS, OS2) | OS2, EMX |
Windows (alle Versionen) | WINDOWS |
Windows 32-bit | WIN32, MSWINDOWS |
Windows 64-bit | WIN64, MSWINDOWS |
Windows (winCE) | WINCE, UNDER_CE, UNICODE |
Classic Amiga | AMIGA |
Atari TOS | ATARI |
Classic Macintosh | MAC |
PalmOS | PALMOS |
PalmOS | PALMOS |
BeOS | BEOS, UNIX |
QNX RTP | QNX, UNIX |
Mac OS X | BSD, DARWIN, UNIX |