Skip to content

FreeBASIC 方言


FreeBASIC 0.17b 版本引入了 -lang 命令行选项,用于更改 BASIC 语言不同方言的语言兼容模式。

从 0.18.3b 版本开始,-lang qb 方言进一步受限,仅允许 QuickBASIC 中允许的内容。

在 0.18.4b 版本中,新增了 -lang fblite 方言,旨在未来取代 -lang deprecated

在 0.20.0b 版本中,新增了 #lang 指令和 $lang 元命令,用于在源代码中指定方言。

-lang 选项描述
fbFreeBASIC 兼容模式(默认)
qbQBasic 兼容模式
fbliteFreeBASIC 语言兼容模式,带有更接近 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(默认模式)

不支持:

  1. 隐式变量声明
  • 所有变量必须使用 DimRedimVarConstExternCommon 显式声明。
  1. 类型后缀(!#$%&
  • 仅允许用于数字字面量,但建议使用 Cast 或数字字面量后缀 fsingle)、ddouble)、lllongint)、ululong)、ullulongint)来解决重载问题。
  1. DefbyteDefubyteDefshortDefushortDefintDefuintDeflngDeflongintDefulongintDefsngDefdblDefstr
  • 使用 DimRedimExternCommon 声明变量时需要显式类型("As T")。使用 VarConst 声明的变量从初始化值推断其类型(使用 Const 时显式类型是可选的)。
  1. 默认通过引用传递所有参数
  • 默认情况下,所有内置标量类型(数值和指针类型)按值(Byval)传递。其他任何类型(String 或用户定义类型)按引用(Byref)传递。
  • 使用 -w pedantic 命令行选项可对没有显式 ByvalByref 的参数进行报告。
  1. 任何类型的 OPTION(无上下文敏感性)
  • #undef 代替 Option Nokeyword
  • !"some esc seq \n\r"(注意 '!' 字符)代替 Option Escape,并传递 -w pedantic 以检查可能的转义序列。
  • 不需要 Option Explicit,见第 1 条。
  • Redim 声明可变长度数组来代替 Option DynamicDim 也可以用来使用变量或无下标声明可变长度数组。
  • 在数组声明中使用显式下界下标代替 Option Base
  • 使用 Private 声明具有内部链接的过程来代替 Option Private
  • 使用带 SubFunction 的过程代替 Option GosubOption Nogosub
  1. 符号名中的句点
  • 改用命名空间。
  1. GosubReturn(从 Gosub 返回)
  • 嵌套过程将来可能会被支持。
  1. On Gosub
  • 改用 Select Case As Const integer_expression
  1. Resume
  • 大多数运行时和图形库过程现在返回错误代码,例如:IF OPEN( "text" FOR INPUT AS #1 ) <> 0 THEN error...
  1. 嵌入在注释中的 '$DYNAMIC'$STATIC'$INCLUDE 元命令
  • 关于 Option Dynamic,见第 5 条。
  • 使用 #include "filename" 代替 '$include
  1. CallLet
  • 直接删除即可。
  1. 数字标签
  • 可改用命名标签,例如 label_name: / Goto label_name
  1. 与关键字同名的全局符号
  • 在命名空间内声明它们。

-lang deprecated

支持:0.16b 版本中允许的任何内容,但:

  1. GOSUB/RETURNON ... GOSUB(即使在模块级别)
  • 因此,GOSUB 的实现在 -lang qb 模式下可能是线程不安全的,允许快速执行(-lang qb 不支持多线程,而 -lang deprecated 支持)。

不支持:

  • 符号名中允许句点使得类的实现过于困难和/或不明确。
  1. 运算符重载
  • 符号名中允许句点使得运算符重载过于困难和/或不明确。
  1. TYPE 中的构造函数、析构函数和方法。
  • 符号名中允许句点使得这些特性过于困难和/或不明确。

-lang fblite

支持:-lang deprecated 方言中允许的任何内容,另加..

  1. GOSUB/RETURN
  • 使用 Option Gosub 来启用。这将禁止 RETURN 退出过程,因为存在歧义。

不支持:

  1. Scope
  • 所有变量具有过程作用域。以后可能会添加显式 Scope 块。

-lang qb

支持:-lang fb 方言中不支持/不允许的所有内容,另加..

  1. Call 可以与前向引用函数一起使用。

  2. Shared 可以在函数内部使用。(开发中)

  3. 所有变量,无论是隐式还是显式声明的,始终分配在过程作用域中,与 QuickBASIC 一样。

  4. Data 语句不查找符号,每个标记都被假定为字面字符串,即使没有引号,与 QuickBASIC 一样。

不支持:

  1. 多线程
  • 不可使用任何 threading 过程。
  1. 类和命名空间

  2. 过程和运算符重载

  3. Type 定义中的构造函数、析构函数和其他成员过程。

  4. Scope

  5. Extern

  6. 变量初始化

  • 所有变量移至过程作用域(与 QuickBASIC 一样),使得初始化局部变量过于困难,难以支持。

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系