与 QB 的差异
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=LangQB
- 最后更新: 2024-03-07
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不能在SUB或FUNCTION内使用,因为这会导致在主程序中未定义的共享变量。必须在主程序中使用适当的DIM SHARED。COMMON声明不依赖于声明的顺序,变量按名称匹配,因此 FB 中不再支持命名 COMMON。FB 中所有 COMMON 数组都是变长数组。- 如果单行
IF在THEN后面紧跟了一个(不必要的)冒号,在 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 ERROR、RESUME等)。 - 八进制数写为
&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 中,应通过将Loc与0比较来测试空缓冲区。另外,对于以RANDOM或BINARY模式打开的文件,在读取恰好等于文件大小的数据后,EOF已经返回非零值,参见Eof。- 即使使用了 -ex 或 -exx 选项,FB 中的整数变量也不会产生溢出错误。任何依赖于捕获整数溢出错误的 QB 代码在 FB 中将无法工作。
BSAVE和BLOAD在 FB 中只能用于保存和恢复屏幕或图形缓冲区。只有当 gfxlib 被链接时(即程序中的某处请求了图形屏幕模式)它们才有效。控制台不能用BSAVE保存或用BLOAD恢复。BSAVE-BLOAD的其他用途——保存和加载完整数组——可以用GET和PUT轻松实现。FIELD语句(用于运行时记录定义)已被搁置。关键字FIELD在 FB 中用于指定TYPE变量中的字段对齐。- PC 扬声器命令不再有效:任何对
SOUND或PLAY语句的引用都会导致错误消息。有第三方库可以模拟此功能,但 FreeBASIC 中不包含。 - 伪事件驱动编程(
ON KEY、ON PEN、ON STRIG、ON TIMER)不再有效。可以通过单独的库来模拟。 MKSMBF$和所有支持 QB4.0 之前微软专有浮点格式(MBF)的MKxMBF$命令均未实现。- 不允许在传递给函数的参数中使用括号来模拟按值传递。
CALL的特殊行为(导致所有参数按值传递)不再有效。必须使用正确的BYVAL和BYREF关键字。 FILES未实现。可改用 PDS 7.1 兼容的DIR[$]。IOCTL、ERRDEV和ERRDEV$这些访问硬件的低级函数未实现,因为它们依赖于操作系统。CALL ABSOLUTE(用于运行内联机器码)不再支持。您可以改用ASM...END ASM块来插入内联汇编命令,或使用ASM ...单行命令。
返回 目录