自版本0.17以来,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。可以通过使用DPMI库在DOS32版本中调用DOS中断,但由于处理器必须执行的32bit-16bit-32bit模式更改,它们可能会运行缓慢。
由于歧义而改变
- 标量变量和具有相同名称和后缀的数组不能再共享相同的名称。
- SHARED不能在SUB或FUNCTION内使用,因为它导致未在主程序中定义的共享变量。必须使用主程序中的DIM SHARED.
- COMMON声明不依赖于它们的顺序,变量与名称匹配,因此不再支持名为COMMON的原因。所有COMMON数组都是FB中的可变长度数组。
- 如果单行If在THEN之后有一个(不必要的)冒号,则必须在FB中终止End If.如果不需要的冒号被删除,FB将表现为QB。
设计差异
- 图形支持内部重新设计,请参阅GfxLib概述
- CLEAR不再用于重置所有变量并设置堆栈。变量必须逐个复位,堆栈大小可以在编译器命令行中更改。关键字CLEAR用于在FB中进行内存填充。
- 字符串DATA项必须用FB中的引号括起来,在QB中这是可选的
- 即使在FreeBASIC中使用CALL,所有功能都必须被声明。使用CALL可以在QuickBASIC中调用无原型的功能。(将来用-lang qb支持)
- 在FreeBASIC中,必须显式声明所有的数组。(解释的QuickBASIC数组自动创建最多10个索引。)
- 字符串使用一个null(char 0)终结符与C库兼容,Windows API的固定长度字符串现在不能包含chr$(0)个字符。
- 当INKEY[$]读取扩展密钥(Num Pad,Arrows ...)时,它返回一个两个字符的字符串。在FB中,第一个字符是CHR[$](255),而在QB中,这个第一个字符是CHR$(0).
- 使用固定长度的字符串FreeBASIC给出真实长度为Len加一个(空字符),即使在Type字段。
- 在FreeBASIC中,无论使用什么“-lang”编译器选项,固定长度字符串的未使用字符都将设置为0.在QB中,未使用的字符设置为32(空格或ASCII码中的“”)。
- 当声明固定长度字符串但仍未初始化时,在FreeBASIC和QB中都将所有字符设置为0。
- 数组按照FB中的主要顺序存储,默认情况下以QB的列大小顺序存储。行主序:具有相同最后索引的数据是连续的。列主要顺序:具有相同第一个索引的数据是连续的。例如,如果您有DIM A(1 TO 3, 1 TO 8),按行主排序,存储元素,使A(3,5)在内存中遵循A(3,6);以列为主的顺序A(3,5)被记忆在A(4,5)之后。
- 除非在命令行中使用-e 或-ex 选项,否则程序不会停止运行时错误。使用这些选项可以使用QB风格的错误处理(ON ERROR,RESUME...)。
- 八进制编号为&o...,而在QB中,它们可以写为&o...或&....
- 在FB FOR中,subs /函数中的循环不接受作为计数器的参数byref.必须使用局部变量。
- FB的Locate不遵守游标形状的第四和第五个参数。
- FB的Screen不允许切换可见或工作页面。改用ScreenSet.
- FB的Color不允许边框颜色的第三个参数。
- FB的Timer返回计算机启动后的秒数,而QB的TIMER返回自午夜以来的秒数。(仅Win32和Linux:午夜没有更多的包装:) :))
- 在QB中,当PRINT编辑时,字符串内的chr$(13)执行了CR+LF.在FB中,CHR(13)打印出来的是一个CR.
- EOF不能再用于检测一个空的comms缓冲区。应在FB中比较LOC与0的空缓冲区。另外,对于在RANDOM或BINARY模式下打开的文件,EOF在完全读取文件大小后就返回非零,请参阅EOF.
- 即使使用-ex 选项,整数变量也不会发出FB中的溢出错误。任何依赖于捕获整数溢出错误的QB代码在FB中都不起作用。
古老的命令
- BSAVE和BLOAD可以在FB中用于保存和检索屏幕或图形缓冲区。它们只有在gfxlib被链接时才会工作,这就是,如果在程序中的某个地方要求图形屏幕模式。无法使用BSAVE保存控制台,或使用BLOAD检索。使用GET和PUT可以轻松实现BSAVE - BLOAD保存和加载完整阵列的其他功能。
- FIELD语句(用于运行时的记录定义)已被放在一边。FB中使用关键字FIELD来指定Type变量中的字段对齐方式。
- PC扬声器命令不再起作用:对SOUND或PLAY语句的任何引用将导致错误消息。有一个第三方库可以模拟这个功能,但它不包括在FreeBASIC中。
- 虚拟事件驱动的编程(ON KEY,ON PEN,ON STRIG,ON TIMER)不再有效。他们可以被一个单独的图书馆模仿。
- MKSMBF$和所有支持前QB4.0 Microsoft专有浮点格式(MBF)的MKxMBF$命令未实现。
- 不允许在传递给功能的参数中使用括号来模拟副值传递。导致所有参数被值传递的CALL奇怪,不再有效。必须使用正确的ByVal和ByRef关键字。
- FILES未实现。相反,可以使用PDS 7.1兼容的Dir[$].
- IOCTL,ERRDEV和ERRDEV$,访问硬件的低级功能未实现,因为它们与操作系统相关。
- 不再支持CALL ABSOLUTE运行内联机器代码。相反,您可以使用Asm...END ASM块插入内联汇编程序命令。或使用ASM ...一行命令。