Referenz - Präprozessoren
Präprozessor-Anweisungen sind Symbole, die vor der Compilation 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 compilieren, 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 compilieren, wenn der Code für DOS umgesetzt werden soll |
__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 compilieren, wenn der Code für Linux umgesetzt werden soll |
__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 compilieren, wenn der Code für diese bestimmte Version umgesetzt werden soll. |
__FB_PCOS__ | Ohne Wert; wird definiert, wenn unter einem PC-artigen Betriebssystem compiliert wurde (z. B. DOS, Windows, OS/2, Symbian OS) |
__FB_UNIX__ | Ohne Wert; wird definiert, wenn unter einem UNIX-artigen Betriebssystem compiliert wurde |
__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 0.24.0" |
__FB_VERSION__ | ein String, der die Version des Compilers enthält, z. B.: "0.24.0" |
__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.: 24 |
__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 Compilier-Datum im Format mm-dd-yyyy enthält, z. B.: "11-15-2012" |
__DATE_ISO__ | ein String, der das Compilier-Datum im Format yyyy-mm-dd enthält, z. B.: "2012-11-15" |
__TIME__ | ein String, der die Compilier-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) compiliert wird, bzw. 0, wenn zu einem anderen Typ compiliert 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) compiliert wird, bzw. 0, wenn zu einem anderen Typ compiliert wird |
__FB_OUT_DLL__ | ein Integer, dessen Wert -1 ist, wenn der Code zur dynamischen Bibliothek (*.dll) compiliert wird, bzw. 0, wenn zu einem anderen Typ compiliert wird |
__FB_OUT_EXE__ | ein Integer, dessen Wert -1 ist, wenn der Code zur Executable (*.exe) compiliert wird, bzw. 0, wenn zu einem anderen Typ compiliert 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 compiliert wird, oder 0, wenn dies nicht der Fall ist |
__FB_DEBUG__ | hat den Wert -1, wenn mit der Kommandozeilenoption '-g' compiliert 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 compiliert 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' compiliert (-fpu SSE) |
__FB_FPU__ | ein String mit dem Wert "sse", wenn mit 'SSE floating point arithmetics' compiliert wurde, ansonsten "x87" |
__FB_FPMODE__ | ein String mit dem mittels -fpmode eingestellte Wert ("fast" oder "precise") |
__FB_VECTORIZE__ | ein Integer mit dem mittels -vec eingestellte Level (0, 1 oder 2) |
__FB_GCC__ | ein Integer, dessen Wert -1 ist, wenn der Code mit -gen gcc compiliert wird, bzw. 0, wenn -gen gas verwendet wird. |
__FB_BACKEND__ | ein String mit dem mittels -gen eingestellte Backend ("gas" oder "gcc") |
__FB_64BIT__ | Ohne Wert; wird definiert, wenn der Code von der 64bit-Version des Compilers umgesetzt wird |
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 Defs
#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 Compilation 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 3.141592654
#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.
Auch mehrzeilige Makros können erstellt werden. Dazu bedient man sich des Metabefehls #MACRO; siehe dort für Beispiele und genauere Erläuterungen.
Unterschiede zu früheren Versionen von FreeBASIC:
- __FB_64BIT__ existiert seit FreeBASIC v0.90.
- __FB_DATE_ISO__ existiert seit FreeBASIC v0.24.
- __FB_GCC__ existiert seit FreeBASIC v0.21.
- Seit FreeBASIC v0.17 können mehrzeilige Makros erstellt werden.
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|