Conditional compilation/de

From Free Pascal wiki

Deutsch (de) English (en) français (fr)

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



--Olaf 09:03, 14 February 2013 (UTC)