Präprozessor-Anweisungen sind Symbole, die vor der Kompilation durch einen bestimmten Ausdruck ersetzt werden; siehe #DEFINE.
Themen:
- Vordefinierte Symbole
- Symbole ohne Wert
- Makros
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=" °2rad(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.