Seit FreeBASIC v0.17 existiert die Kommandozeilenoption -lang. Diese wird verwendet, um den Kompatibilitätsmodus auf verschiedene Versionen von FreeBASIC einzustellen. Das Kommando -lang benötigt einen Parameter, der angibt, mit welchem Kompatibilitätsmodus kompiliert werden soll:
Option | Beschreibung |
---|---|
"fb" | FreeBASIC-Kompatibilität (Standard) |
"deprecated" | Kompatibilität zu früheren Versionen von FreeBASIC |
"fblite" | Kompatiblität zu FreeBASIC, aber mit einem Programmierstil, der kompatibler zu QBASIC ist |
"qb" | QBASIC-Kompatibilität |
Seit FreeBASIC v0.20 ist auch die Optionsangabe als Metabefehl #LANG 'Option' am Anfang des Quelltextes möglich.
Die "-lang"-Option wurde nötig, um Objektorientierung und andere Features in FreeBASIC zu ermöglichen, ohne die Abwärtskompatibilität zu QB oder zu Quellcodes für ältere Versionen von FreeBASIC aufgeben zu müssen oder viele verschiedene Compiler-Versionen entwickeln zu müssen. Um alte GW-BASIC- und QB(ASIC)-Quellcodes ohne größere Änderungen kompilieren zu können, geben Sie die Kommandozeile
-lang qb
an. Um Codes zu kompilieren, die für FreeBASIC v0.16 oder älter geschrieben wurden, geben Sie die Kommandozeile
-lang deprecated
an. Der Modus
-lang fb
ist der Standard-Modus. Diese Zeile muss (noch) nicht explizit angegeben werden. Sie unterscheidet sich von der 'deprecated'-Variante durch diese Dinge:
-lang fb
Nicht mehr unterstützt
- Implizite Variablen: Alle Variablen müssen explizit deklariert werden, d.h. eine Variable kann nur benutzt werden, wenn sie zuvor mit DIM, COMMON, STATIC oder EXTERN deklariert wurde.
- Suffixe (! # $ % &): Suffixe sind nur noch in numerischen Konstanten erlaubt, allerdings wird empfohlen, stattdessen die Type-Casting-Funktionen (siehe CAST) oder die Suffixe f (single), d (double), ll (longint), ul (uinteger), ull (ulongint) zu verwenden.
- DEFxxx: Da keine impliziten Variablen mehr existieren, sind auch diese Schlüsselwörter obsolet; sie wurden entfernt. AS Typ muss also immer angegeben werden (mit Ausnahme von Konstanten, bei denen der Datentyp automatisch gewählt wird; siehe dazu CONST.
- BYREF: Alle Variablen werden standardmäßig BYVAL übergeben. Geben Sie die Kommandozeilenoption -w pedantic an, um Warnungen für jede Deklaration zu bekommen, bei der nicht explizit festgelegt wurde, ob eine Variable ByVal oder ByRef übergeben wird.
- OPTION
Benutzen Sie #UNDEF anstelle von NOKEYWORD.
Der ESCAPE-Standard wurde wieder entfernt. Um einen String mit ESCAPE-Sequenzen zu behandeln, stellen Sie einem String ein '!' voran, und benutzen Sie die -w pedantic Option, um auf mögliche Escape-Sequenzen zu prüfen. Beispiel: !"eine Escape-Sequenz \n\r"
EXPLICIT wird nicht mehr benötigt; Siehe 1).
BYVAL wird nicht mehr benötigt; Siehe 4).
Benutzen Sie REDIM anstelle von DYNAMIC, um dynamische Arrays zu erstellen, oder geben Sie bei der Dimensionierung keine Indizes an: DIM array() AS SomeType
Geben Sie explizit die untere Arraygrenze an, und verzichten Sie auf BASE.
Deklarieren Sie jede Prozedur explizit als PRIVATE und verzichten Sie auf die Option. - Punkte in Symbolnamen: Punkte in Symbolnamen sind nicht mehr zulässig. Benutzen Sie stattdessen NAMESPACE.
- GOSUB/RETURN: Verschachtelte Prozeduren könnten in Zukunft möglich sein.
- ON...GOSUB, ON...GOTO: Benutzen Sie SELECT CASE AS CONST anstelle dieser Anweisungen.
- RESUME: Alle Anweisungen können als Funktionen genutzt werden, um Laufzeitfehler abzufragen. Beispiel: IF OPEN("datei" FOR INPUT AS #1) <> 0 THEN ...
- In Kommentare eingebundene Meta-Befehle: Die Metabefehle '$DYNAMIC, '$STATIC, '$INCLUDE, '$INCLIB existieren nicht mehr. Benutzen Sie #INCLUDE bzw. #INCLIB, um diese Befehle zu ersetzen. Zu '$DYNAMIC und '$STATIC siehe Punkt 5.
- CALL und LET: Entfernen Sie diese Anweisungen einfach.
- nummerische Labels: Labels, die nur aus einer Zahl bestehen, werden nicht mehr unterstützt.
- Globale Symbol, die den Namen eines internen Schlüsselworts besitzen. Möchten Sie diese weiterhin benutzen, müssen Sie diese in einem NAMESPACE deklarieren.
-lang deprecated
Unterstützt
- Alles, das bereits in FreeBASIC v0.16 unterstützt wurde, mit Ausnahme von ON...GOSUB, ON...GOTO und ON...GOSUB (sogar auf dem Modullevel)
nicht mehr unterstützt
- Klassen: Da Punkte in Symbolnamen erlaubt sind, ist es zu schwierig, dieses Feature zu implementieren.
- Operator overloading: Da Punkte in Symbolnamen erlaubt sind, ist es zu schwierig, dieses Feature zu implementieren.
Die Option
-lang deprecated
wurde bereitgestellt, um Code einfach von einer Entwicklungsversion in die nächste zu upgraden. Sie wird möglicherweise in einem Major-Release wie FreeBasic 1.0 entfernt werden.
-lang fblite
Unterstützt
- Alles, was in -lang deprecated erlaubt ist, außer Scope-Blöcken: Variablen gehören dem aktuellen Scope (Programmblock) an.
-lang qb
Unterstützt
- Alles, das im FB-Modus nicht erlaubt ist. Außerdem:
- CALL kann verwendet werden, um Forward-Referencing bei Funktionen zu realisieren. (Feature in Arbeit...)
- SHARED kann innerhalb von Prozeduren eingesetzt werden. (Feature in Arbeit...)
- Variable Scope: Alle Variablen, ob implizit oder explizit deklariert werden im Scope der Prozedur alloziert, wie in QB.
Nicht unterstützt
- Multi-Threading: Die THREADxxx, MUTEXxxx und CONDxxx-Anweisungen können nicht eingesetzt werden. Siehe THREADCREATE.
- Klassen und Namespaces
- Prozedur- und Operator-Overloading (Siehe OVERLOAD)
- SCOPE-Blöcke (siehe SCOPE)
- EXTERN-Blöcke
- Variablen-Initiatoren: Alle Variablen werden auf den Scope der Prozedur verschoben (wie in QB), sodass lokale Initiatoren schwierig zu implementieren sind.
FB-eigene Befehle im QB-Kompatiblitätsmodus
Befehle, die in FB neu hinzugekommen sind, können mit einem Trick auch im QB-Kompatiblitätsmodus benutzt werden: Versehen Sie diese mit einem doppelten Unterstrich am Wortanfang, um sie zu benutzen. Beispiel: __INSTRREV
Beachten Sie, dass bei Befehlen, deren Verhalten sich in FreeBasic geändert hat (z.B. SLEEP oder INKEY), auch das FB-Verhalten übernommen wird. So wartet __SLEEP 1 im QB-kompatiblitätsmodus eine Millisekunde, während SLEEP 1 - wie aus QB gewohnt - eine Sekunde wartet. Bei __INKEY wird dementsprechend CHR(255) statt CHR(0) als erweitertes Zeichen benutzt.
Hinweis: Die Option
-lang qb
wird in allen Folgeversionen von FreeBASIC erhalten bleiben.