FreeBASIC 方言
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=CompilerDialects
- 最后更新: 2020-08-13
FreeBASIC 0.17b 版本引入了 -lang 命令行选项,用于更改 BASIC 语言不同方言的语言兼容模式。
从 0.18.3b 版本开始,-lang qb 方言进一步受限,仅允许 QuickBASIC 中允许的内容。
在 0.18.4b 版本中,新增了 -lang fblite 方言,旨在未来取代 -lang deprecated。
在 0.20.0b 版本中,新增了 #lang 指令和 $lang 元命令,用于在源代码中指定方言。
| -lang 选项 | 描述 |
|---|---|
| fb | FreeBASIC 兼容模式(默认) |
| qb | QBasic 兼容模式 |
| fblite | FreeBASIC 语言兼容模式,带有更接近 QBASIC 的编码风格 |
| deprecated | 与 FB 0.16 兼容 |
引入 -lang 选项是为了让 FreeBASIC 能够在未来支持面向对象和其他特性,同时不破坏 QuickBASIC 支持、不影响旧 FreeBASIC 源代码的兼容性,也不会因维护多个非常相似的包而使 FreeBASIC 难以维护。如有需要,可以继续改善 QuickBASIC 支持,而不会破坏专门为 FreeBASIC 编写的源代码。
要编译旧的 GW-BASIC 或 QuickBASIC/QBasic 源代码而无需过多修改,请在运行 fbc 时使用命令行上的 -lang qb 选项。该选项将不断演进,以实现与 QuickBASIC/QBasic 代码更好的兼容性。
要编译 0.16b 版本的 FreeBASIC 源代码,请使用 -lang deprecated 选项。该选项仅为兼容性而维护,未来不会演进,并且很可能在 FreeBASIC 发布正式版时消失。
对于希望使用 FreeBASIC 部分新特性、同时保留更接近 QBASIC 编程风格的程序员,请使用 -lang fblite 选项。该方言未来不会发生重大变化,但将继续被维护和支持。
该选项也与使用旧版 FreeBASIC 编写的源代码最为兼容。
建议对新项目使用 -lang fb,因为新特性(对象类、继承等)将仅添加到该方言中。
-lang fb(默认模式)
不支持:
- 隐式变量声明
- 所有变量必须使用
Dim、Redim、Var、Const、Extern或Common显式声明。
- 类型后缀(
!、#、$、%、&)
- 仅允许用于数字字面量,但建议使用
Cast或数字字面量后缀f(single)、d(double)、ll(longint)、ul(ulong)、ull(ulongint)来解决重载问题。
Defbyte、Defubyte、Defshort、Defushort、Defint、Defuint、Deflng、Deflongint、Defulongint、Defsng、Defdbl、Defstr
- 使用
Dim、Redim、Extern或Common声明变量时需要显式类型("As T")。使用Var或Const声明的变量从初始化值推断其类型(使用Const时显式类型是可选的)。
- 默认通过引用传递所有参数
- 默认情况下,所有内置标量类型(数值和指针类型)按值(
Byval)传递。其他任何类型(String或用户定义类型)按引用(Byref)传递。 - 使用
-w pedantic命令行选项可对没有显式Byval或Byref的参数进行报告。
- 任何类型的
OPTION(无上下文敏感性)
- 用
#undef代替Option Nokeyword。 - 用
!"some esc seq \n\r"(注意 '!' 字符)代替Option Escape,并传递-w pedantic以检查可能的转义序列。 - 不需要
Option Explicit,见第 1 条。 - 用
Redim声明可变长度数组来代替Option Dynamic。Dim也可以用来使用变量或无下标声明可变长度数组。 - 在数组声明中使用显式下界下标代替
Option Base。 - 使用
Private声明具有内部链接的过程来代替Option Private。 - 使用带
Sub或Function的过程代替Option Gosub和Option Nogosub。
- 符号名中的句点
- 改用命名空间。
Gosub或Return(从 Gosub 返回)
- 嵌套过程将来可能会被支持。
On Gosub
- 改用
Select Case As Const integer_expression。
Resume
- 大多数运行时和图形库过程现在返回错误代码,例如:
IF OPEN( "text" FOR INPUT AS #1 ) <> 0 THEN error...
- 嵌入在注释中的
'$DYNAMIC、'$STATIC、'$INCLUDE元命令
- 关于
Option Dynamic,见第 5 条。 - 使用
#include "filename"代替'$include。
Call或Let
- 直接删除即可。
- 数字标签
- 可改用命名标签,例如
label_name:/Goto label_name。
- 与关键字同名的全局符号
- 在命名空间内声明它们。
-lang deprecated
支持:0.16b 版本中允许的任何内容,但:
GOSUB/RETURN和ON ... GOSUB(即使在模块级别)
- 因此,
GOSUB的实现在-lang qb模式下可能是线程不安全的,允许快速执行(-lang qb不支持多线程,而-lang deprecated支持)。
不支持:
- 类
- 符号名中允许句点使得类的实现过于困难和/或不明确。
- 运算符重载
- 符号名中允许句点使得运算符重载过于困难和/或不明确。
TYPE中的构造函数、析构函数和方法。
- 符号名中允许句点使得这些特性过于困难和/或不明确。
-lang fblite
支持:-lang deprecated 方言中允许的任何内容,另加..
GOSUB/RETURN
- 使用
Option Gosub来启用。这将禁止RETURN退出过程,因为存在歧义。
不支持:
Scope块
- 所有变量具有过程作用域。以后可能会添加显式
Scope块。
-lang qb
支持:-lang fb 方言中不支持/不允许的所有内容,另加..
Call可以与前向引用函数一起使用。Shared可以在函数内部使用。(开发中)所有变量,无论是隐式还是显式声明的,始终分配在过程作用域中,与 QuickBASIC 一样。
Data语句不查找符号,每个标记都被假定为字面字符串,即使没有引号,与 QuickBASIC 一样。
不支持:
- 多线程
- 不可使用任何
threading过程。
类和命名空间
过程和运算符重载
Type定义中的构造函数、析构函数和其他成员过程。Scope块Extern块变量初始化
- 所有变量移至过程作用域(与 QuickBASIC 一样),使得初始化局部变量过于困难,难以支持。
返回 目录