Referenz - DEFINE (Meta)
Syntax A: #DEFINE Symbol [ Ausdruck ]
Syntax B: #DEFINE Symbol ( Parameter [, Parameter] [...] ) Makro
Typ: Metabefehl
Kategorie: Metabefehle
#DEFINE definiert ein Symbol mit benutzerdefinierter Bedeutung oder ein Makro.
- 'Symbol' ist ein Bezeichner, der direkt vor der Compilation durch seinen Ausdruck ersetzt wird. Selbst wenn es keinen Wert besitzt (wie in Syntax A ohne Angabe von 'Ausdruck') kann das Symbol bereits mit DEFINED verwendet werden.
- 'Parameter' sind Parameter, die im definierten Makro eingesetzt werden können.
- Mit der Ellipsis ... (Auslassung) kann eine variable Zahl an Parametern übergeben werden. Dann wird an der Stelle des letzten angegebenen Parameters die komplette restliche Parameterliste eingefügt. Siehe dazu Beispiel 2.
- Das Symbol ist nur in dem SCOPE-Block (auch SUB, FOR...NEXT, WHILE...WEND, DO...LOOP usw.) sichtbar, in dem es definiert wurde. Wenn es auf Modulebene definiert wurde, ist es im gesamten Modul sichtbar.
- NAMESPACEs haben keinen Effekt auf die Sichtbarkeit des Symbols.
Ein Makro ist im Grunde eine FUNCTION; direkt vor der Compilation wird der Makro-Bezeichner durch seinen Ausdruck ersetzt. Dabei können in diesem Ausdruck Parameter verwendet werden, die zuvor unter 'Parameter' festgelegt wurden. Makros werden meist für häufig auftretende mathematische Formeln verwendet.
Durch einfaches Definieren eines Symbols kann das Programm komplett anders laufen. Diese Funktion ermöglicht FreeBASIC u. a., ein Programm portabel zu verschiedenen Betriebssystemen zu halten, indem z. B. bestimmte Codeabschnitte nur unter Windows und andere nur unter Linux eingebunden werden. Einige Symbole und Makros sind bereits vordefiniert; siehe Präprozessoren.
Makros können auch als Parameter für andere Makros übergeben werden. In diesem Fall müssen auch dann Klammern für die Parameterliste angegeben werden, wenn es sich um ein parameterloses Makro handelt.
Beispiel 1:
Makros erstellen, die zwischen Altgrad DEG, Kreis mit 360°), Neugrad (GON, Kreis mit 400gon) und Bogenmaß (RAD, Kreis mit 2 PI) umrechnen
#DEFINE PI (4 * ATN(1))
#DEFINE deg2rad(deg) ( (deg / 180) * PI)
#DEFINE rad2deg(rad) ( (rad / PI) * 180 )
#DEFINE gon2rad(gon) ( (gon / 200) * PI)
#DEFINE rad2gon(rad) ( (rad / PI) * 200 )
PRINT "PI ="; PI
' Ausgabe: 3.141592654
PRINT "180 im Bogenmaß: " & deg2rad(180)
' Ausgabe: 3.141592654
PRINT "3.141592654 in Altgrad°(DEG): " & rad2deg(pi)
' Ausgabe: 180
PRINT "200gon im Bogenmaß: " & gon2rad(200)
' Ausgabe: 3.141592654
PRINT "3.141592654 in Neugrad(GON): " & rad2gon(pi)
' Ausgabe: 200
SLEEP
Beispiel 2 mit variabler Anzahl von Parametern:
#include "crt.bi"
#define eprintf(Format, args...) fprintf(stderr, Format, args)
eprintf(!"Hello from printf: %i %s %i\n", 5, "test", 123)
#define car(a, b...) a
#define cdr(a, b...) b
PRINT "car (1, 2, 3, 4) = "; car(1, 2, 3, 4)
PRINT "cdr (1, 2, 3, 4) = "; cdr(1, 2, 3, 4)
SLEEP
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.22 kann eine variable Parameterliste übergeben werden.
- Seit FreeBASIC v0.16 können Makros auch als Parameter für andere Makros übergeben werden. In diesem Fall müssen auch dann Klammern für die Parameterliste angegeben werden, wenn es sich um ein parameterloses Makro handelt.
Siehe auch:
DEFINED, UNDEF (Meta), MACRO (Meta), IF (Meta), IFDEF (Meta), IFNDEF (Meta), Präprozessoren, Präprozessor-Anweisungen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|