Präprozessoren

FreeBASIC-Referenz » BASIC-Grundlagen » Präprozessoren

Präprozessor-Anweisungen sind Symbole, die vor der Kompilation durch einen bestimmten Ausdruck ersetzt werden; siehe #DEFINE.

Themen:

Vordefinierte Symbole
Beachten Sie, dass zu jedem Symbol ein eigener Eintrag in der Referenz existiert.

SymbolbezeichnerÜbersetzung/Bedeutung
__FB_WIN32__Ohne Wert; wird definiert, wenn der Code von der Win32-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Win32 umgesetzt werden soll
__FB_DOS__Ohne Wert; wird definiert, wenn der Code von der DOS-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für DOS umgesetzt werden sollen
__FB_LINUX__Ohne Wert; wird definiert, wenn der Code von der LINUX-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Linux umgesetzt werden sollen
__FB_XBOX__ , __FB_CYGWIN__ , __FB_DARWIN__ , __FB_FREEBSD__ , __FB_OPENBSD__ , __FB_NETBSD__Ohne Wert; diese Symbole werden definiert, wenn der Code in der jeweiligen Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für diese bestimmte Version umgesetzt werden soll.
__FB_PCOS__-1, wenn unter einem PC-artigen Betriebssystem kompiliert wurde (z. B. DOS, Windows, OS/2, Symbian OS); sonst 0
__FB_UNIX__-1, wenn unter einem UNIX-artigen Betriebssystem kompiliert wurde; sonst 0
__FB_MAIN__Ohne Wert; wird definiert, sobald die DEFINE-Symbole und Makros des Hauptmoduls übersetzt werden.
__FB_SIGNATURE__ein String, der die Signatur des Compilers enthält, z.B.: "FreeBASIC v0.17b"
__FB_VERSION__ein String, der die Version des Compilers enthält, z.B.: "0.15"
__FB_VER_MAJOR__ein Integer, der die Versionshauptnummer des Compilers enthält, z.B.: 0
__FB_VER_MINOR__ein Integer, der die Versionsunternummer des Compilers enthält, z.B.: 15
__FB_VER_PATCH__ein Integer, der die Patchnummer des Compilers enthält, z.B.: 0
__FB_MIN_VERSION__(major, minor, patch)Dieses Makro vergleicht die Version des verwendeten Compilers mit den angegebenen Daten. Es gibt -1 aus, wenn die Version des Compilers größer oder gleich den Spezifikationen ist, bzw. 0, wenn die Version kleiner ist.
__DATE__ein String, der das Kompilier-Datum im Format mm-dd-yyyy enthält, z.B.: "11-15-2005"
__DATE_ISO__ein String, der das Kompilier-Datum im Format yyyy-mm-dd enthält. Existiert erst seit 0.24 Git
__TIME__ein String, der die Kompilier-Uhrzeit im Format hh:mm:ss enthält, z.B.: "16:05:09"
__FB_BUILD_DATE__ ein String, der das Datum, an dem der FB-Compiler erstellt wurde, im Format mm-dd-yyyy enthält
__FILE__ein String, der den Dateinamen der Quellcode-Datei, die gerade umgesetzt wird, enthält; dies kann zur Fehlersuche eingesetzt werden
__FILE_NQ__eine Zeichenkette, die den Namen des Moduls enthält, das gerade umgesetzt wird, jedoch nicht in Anführungszeichen wie bei __FILE__
__FUNCTION__ein String, der den Namen der Prozedur, die gerade umgesetzt wird, enthält; dies kann zur Fehlersuche eingesetzt werden
__FUNCTION_NQ__eine Zeichenkette, die das Symbol der Prozedur enthält, die gerade umgesetzt wird, jedoch nicht in Anführungszeichen wie bei __FUNCTION__
__LINE__ein Integer, der die Zeile angibt, die gerade umgesetzt wird; dies kann zur Fehlersuche eingesetzt werden
__PATH__ein String, der den Namen des Verzeichnisses enthält, in dem sich die gerade umgesetzte Quellcode-Datei befindet
__FB_OPTION_EXPLICIT__ein Integer, dessen Wert -1 ist, wenn OPTION EXPLICIT verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OPTION_ESCAPE__ein Integer, dessen Wert -1 ist, wenn OPTION ESCAPE verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OPTION_DYNAMIC__ein Integer, dessen Wert -1 ist, wenn OPTION DYNAMIC verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OPTION_PRIVATE__ein Integer, dessen Wert -1 ist, wenn OPTION PRIVATE verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OPTION_BYVAL__ein Integer, dessen Wert -1 ist, wenn OPTION BYVAL verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OPTION_GOSUB__ein Integer, dessen Wert -1 ist, wenn OPTION GOSUB verwendet wird, bzw. 0, wenn dies nicht der Fall ist
__FB_OUT_OBJ__ein Integer, dessen Wert -1 ist, wenn der Code zu einer Ressource (*.obj) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird
__FB_OUT_LIB__ein Integer, dessen Wert -1 ist, wenn der Code zur statischen Bibliothek (lib*.a oder lib*.a.dll für Importbibliotheken) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird
__FB_OUT_DLL__ein Integer, dessen Wert -1 ist, wenn der Code zur dynamischen Bibliothek (*.dll) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird
__FB_OUT_EXE__ein Integer, dessen Wert -1 ist, wenn der Code zur Executable (*.exe) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird
__FB_ARGC__eine Zahl, die die Anzahl der Kommandozeilenparameter an das Programm enthält
__FB_ARGV__ein Pointer auf einen Speicherbereich, in dem sich ZSTRING PTR befinden; diese zeigen auf die einzelnen Kommandozeilenparameter
__FB_BIGENDIAN__hat den Wert -1, wenn für Big-Endian-Systeme kompiliert wird, oder 0, wenn dies nicht der Fall ist
__FB_DEBUG__hat den Wert -1, wenn mit der Kommandozeilenoption '-g' kompiliert wird, oder 0, wenn dies nicht der Fall ist
__FB_ERR__hat den Wert 0, 1, 3 oder 7, je nach der in der Kommandozeile aktivierten Fehlerbehandlungsroutine (keine, '-e', '-ex' oder '-exx')
__FB_MT__hat den Wert -1, wenn mit der FB-Multithread-Lib kompiliert wird, oder 0, wenn dies nicht der Fall ist
__FB_LANG__wird zu einem String umgesetzt, der das Argument für die Kommandozeilenoption '-lang' enthält
__FB_SSE__ohne einen Wert; wird definiert, wenn der Compiler 'SSE floating point arithmetics' kompiliert wurde (-fpu SSE)
__FB_FPU__enthält "sse", wenn mit 'SSE floating point arithmetics' kompiliert wurde, ansonsten "x87"
__FB_FPMODE__der mittels -fpmode eingestellte Wert ("fast" oder "precise")
__FB_VECTORIZE__das mittels -vec eingestellte Level (0, 1 oder 2)
__FB_BACKEND__das mittels -gen eingestellte Backend ("gas" oder "gcc")

Symbole ohne Wert
Ein Symbol muss nicht zwingend einen Wert haben, um nutzbringend eingesetzt werden zu können. Mit DEFINED kann geprüft werden, ob ein Symbol bereits definiert wurde. Auf diese Weise lässt sich z.B. ermitteln, ob eine Datei bereits eingebunden wurde, oder auf welcher Plattform das Programm gerade läuft.

Beispiel:

' Code der Datei Definitions.bi
#DEFINE Def

TYPE xyz
x AS INTEGER
y AS INTEGER
z AS INTEGER
END TYPE

'---------'

' Code der Datei Test.bas

#INCLUDE "Definitions.bi"

#IFNDEF(Def)
#ERROR Die Datei 'Definitions.bi' wurde nicht eingebunden
#ENDIF

#IFDEF __FB_WIN32__
#PRINT Setze Code für Windows um.
#ELSEIF DEFINED(__FB_DOS__)
#PRINT Setze Code für DOS um.
#ELSEIF DEFINED(__FB_LINUX__)
#PRINT Setze Code für Linux um.
#ENDIF

Makros
Makros sind wie FUNCTIONs Ausdrücke, die von einem Parameter abhängig sind. Im Gegensatz zu solchen werden die Symbole aber vor der Kompilation in ihre Bedeutung umgesetzt, so dass kein Sprung im Programm ausgeführt werden muss. Im Gegensatz zu FUNCTIONs allerdings öffnen Makros keinen SCOPE-Block.

Beispiel:

#DEFINE pi ( 4# * ATN(1#) )
#DEFINE deg2rad(deg) ( (deg / 180#) * pi )
#DEFINE rad2deg(rad) ( (rad / pi) * 180# )
PRINT "Pi =" &pi ' Ausgabe: 3.141592654
PRINT "180 im Bogenmass=" &deg2rad(180) ' Ausgabe: 3.141592654
PRINT "Pi in Grad=" &rad2deg(Pi) ' Ausgabe: 180

Eine besondere Bedeutung kommt Makros dadurch zu, dass sie im Code Zeichenketten zu Symbolen verketten können; dies geschieht über die Zeichen ##.

Beispiel:

#DEFINE TmpVar(n) t##n
DIM AS INTEGER TmpVar(1) = 5, TmpVar(2) = 7
PRINT "Macros: "; TmpVar(1) * TmpVar(2)
PRINT "Variables: "; t1 * t2

Bei jedem Zugriff auf TmpVar wird also tatsächlich auf ein Symbol zugegriffen, das mit 't' beginnt, und mit dem Wert von 'n' endet.

Seit FreeBASIC v0.17 können auch mehrzeilige Macros erstellt werden; dazu bedient man sich des Metabefehls #MACRO. Siehe dort für Beispiele und genauere Erläuterungen.