Skip to content

与 QB 的差异


FreeBASIC 引入了 -lang 命令行选项,用于更改语言兼容模式。编译时使用 -lang qb 选项可选择兼容性最强的 QB 解析器。以下列出的所有差异均假设使用了 -lang qb。

架构/平台不兼容性

  • FreeBASIC 为 32 位操作系统和 32 位 DOS 扩展器而编写,无法利用依赖 16 位 DOS、16 位汇编或内存模型(段和偏移、XMS/EMS 等)的代码。
  • DEF SEG 不再必要,也不再有效——任何以这种方式 POKE 到视频内存的代码将不再有效,但在 DOS 下可以使用 DPMI 特性轻松重写。
  • CALL INTERRUPT 不再有效,因为它依赖于 16 位 DOS。DOS 中断在 DOS32 版本中可以通过 DPMI 库调用,但可能因处理器需要执行的 32 位-16 位-32 位模式切换而运行缓慢。

因歧义而更改

  • 具有相同名称和后缀的标量变量和数组不能再共享同一名称。
  • SHARED 不能在 SUBFUNCTION 内使用,因为这会导致在主程序中未定义的共享变量。必须在主程序中使用适当的 DIM SHARED
  • COMMON 声明不依赖于声明的顺序,变量按名称匹配,因此 FB 中不再支持命名 COMMON。FB 中所有 COMMON 数组都是变长数组。
  • 如果单行 IFTHEN 后面紧跟了一个(不必要的)冒号,在 FB 中必须用 END IF 终止。如果去掉那个不需要的冒号,FB 的行为就会像 QB 一样。

设计差异

  • 图形支持经过了内部重新设计,参见 GfxLib 概述
  • CLEAR 不再用于重置所有变量和设置栈。变量必须逐一重置,栈大小可以在编译器命令行中更改。关键字 CLEAR 在 FB 中用于内存填充。
  • 字符串 DATA 项在 FB 中必须用引号括起来,而在 QB 中这是可选的
  • 在 FreeBASIC 中,即使使用 CALL,所有函数也必须已声明。在 QuickBASIC 中,使用 CALL 可以调用没有原型的函数。(将来的 -lang qb 中可能支持)
  • 在 FreeBASIC 中,所有数组必须显式声明。(解释型 QuickBASIC 数组最多可以自动创建 10 个索引。)
  • 字符串(自 fbc 1.20.0 版本起的 STRING*N 类型定长字符串除外)使用空(字符 0)终止符以与 C 库和 Windows API 兼容,因此此类定长字符串不能包含 chr$(0) 字符。
  • INKEY[$] 读取扩展键(数字键盘、方向键等)时,返回一个两字符字符串。在 FB 中,第一个字符是 CHR[$](255),而在 QB 中,这个第一个字符是 CHR$(0)
  • 对于定长字符串(自 fbc 1.20.0 版本起的 STRING*N 类型定长字符串除外),FreeBASIC 的 LEN 返回真实长度加一(空字符),即使是 TYPE 字段也如此。
  • 在 FreeBASIC 中,无论使用哪个"-lang"编译器选项,定长字符串的未使用字符都被设置为 0。在 QB 中,未使用字符被设置为 32(空格,即 ASCII 中的 " ")。
  • 当定长字符串(自 fbc 1.20.0 版本起的 STRING*N 类型除外)已声明但尚未初始化时,FreeBASIC 和 QB 中的所有字符都被设置为 0。自 fbc 1.20.0 版本起,当 STRING*N 类型的定长字符串已声明但尚未初始化时,所有字符被设置为空格。
  • FB 中数组以行主序存储,而 QB 默认以列主序存储。行主序:最后一个索引连续的数据在内存中相邻。列主序:第一个索引连续的数据在内存中相邻。例如,对于 DIM A(1 TO 6, 1 TO 8),在行主序中元素存储使得 A(3,5) 在内存中紧跟着 A(3,6);在列主序中 A(3,5) 在内存中紧跟着 A(4,5)
  • 除非在命令行中使用了 -e-ex-exx 选项,否则程序不再在运行时错误时停止。使用这些选项可以使用 QB 风格的错误处理(ON ERRORRESUME 等)。
  • 八进制数写为 &o...,而在 QB 中可以写为 &o...&...
  • 在 FB 中,子程序/函数中的 FOR 循环不接受以 byref 方式接收的参数作为计数器。必须使用局部变量。
  • FB 的 LOCATE 不遵守用于光标形状的第四和第五个参数。
  • FB 的 SCREEN(图形) 不允许切换可见页或工作页。改用 SCREENSET
  • FB 的 COLOR 不允许边框颜色的第三个参数。
  • FB 的 TIMER 返回自计算机启动以来的秒数,而 QB 的 TIMER 返回自午夜以来的秒数。(仅 Win32 和 Linux:不再在午夜时环绕! 😃)
  • 在 QB 中,字符串中的 chr$(13)PRINT 时会执行 CR+LF。在 FB 中,CHR(13) 只打印它本来的值,即 CR
  • EOF 不再能用于检测空的通信缓冲区。在 FB 中,应通过将 Loc0 比较来测试空缓冲区。另外,对于以 RANDOMBINARY 模式打开的文件,在读取恰好等于文件大小的数据后,EOF 已经返回非零值,参见 Eof
  • 即使使用了 -ex-exx 选项,FB 中的整数变量也不会产生溢出错误。任何依赖于捕获整数溢出错误的 QB 代码在 FB 中将无法工作。

过时命令

  • BSAVEBLOAD 在 FB 中只能用于保存和恢复屏幕或图形缓冲区。只有当 gfxlib 被链接时(即程序中的某处请求了图形屏幕模式)它们才有效。控制台不能用 BSAVE 保存或用 BLOAD 恢复。BSAVE-BLOAD 的其他用途——保存和加载完整数组——可以用 GETPUT 轻松实现。
  • FIELD 语句(用于运行时记录定义)已被搁置。关键字 FIELD 在 FB 中用于指定 TYPE 变量中的字段对齐。
  • PC 扬声器命令不再有效:任何对 SOUNDPLAY 语句的引用都会导致错误消息。有第三方库可以模拟此功能,但 FreeBASIC 中不包含。
  • 伪事件驱动编程(ON KEYON PENON STRIGON TIMER)不再有效。可以通过单独的库来模拟。
  • MKSMBF$ 和所有支持 QB4.0 之前微软专有浮点格式(MBF)的 MKxMBF$ 命令均未实现。
  • 不允许在传递给函数的参数中使用括号来模拟按值传递。CALL 的特殊行为(导致所有参数按值传递)不再有效。必须使用正确的 BYVALBYREF 关键字。
  • FILES 未实现。可改用 PDS 7.1 兼容的 DIR[$]。
  • IOCTLERRDEVERRDEV$ 这些访问硬件的低级函数未实现,因为它们依赖于操作系统。
  • CALL ABSOLUTE(用于运行内联机器码)不再支持。您可以改用 ASM...END ASM 块来插入内联汇编命令,或使用 ASM ... 单行命令。

返回 目录

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