Freebasic菜鸟初学Freebasic基础教程八:Freebasic和VB6(vba)语法差异:
已有 3703 次阅读2017-5-11 10:01
|个人分类:FreeBasic
Freebasic和VB6(vba)语法差异:
(1)字符串是不同的:
vb6只有一种字符串那就是bstr,bstr是特殊的unicode类型的字符串。
Freebasic支持三种字符串,zstring(兼容c的char,除了调用c/c++库,一般不用),标准
的string(ascii)不固定长度,最大2的32次方,wstring(unicode)。zstring和wstring只能使用指针
,或固定长度的字符串。只要是字符串类型,都是指针,不管是vbstring,zstring,string,wstring都
是指针。
在FB中zstring和string一般是等同的(其中的非常细小差别,你可以具体看参考文档)。wstring用于
unicode,因为是中文环境,所以wstring我们会使用得非常频繁。
zstring和wstring只能这样用:
Dim myWstr As wstring ptr '声明成指针类型
mywstr=WSpace(200) '先分配指针内存大小,也就是缓存区
然后再开始赋值。
mywstr="Freebasic入门"
或者: Dim myWstr As wstring*26 '声明成定长的字符串
myWstr="Freebasic入门"
string则是不定长的,动态字符串数组
用法和VB中是一样的:
Dim myStr As String
myStr="Freebasic入门"
string和wstring类型的转换很简单
myWstr=wstr(mystr),ansii转成unioce类型
mystr=Str(myWstr),unicode转成ansii
Str()和Wstr()相当于vb中的Cstr()。这两个函数会使用得相当频繁。
所有的FB的字符串函数都同样适用于string和wstring,没有区别。
FB中len()函数对于anscii类型的string,zstring总是返回字符串的字节大小,和VB中的lenB()是一样的。
对于unicode类型的wstring总是返回字符串中字符的个数,和vb中的len()是一样的。
FB中没有like这样的关键字,所以如果要进行匹配,只能使用正则。
(2)数组是不同的。
vb中的数组叫safeAarray,安全数组,这是一个性能不太高的数组类型,但它线程安全。
FB中的数组就是c的数组,性能比安全数组要高很多。
用法几乎是一模一样的。
FB的数组:
Dim myArr() As Long '动态空数组,使用时,必须Redim
或 Dim myArr(2,3) As String '声明成固定大小数组,可直接使用
(3)variant。
FB中没有Variant这种类型,所以FB中任何变量都必须要指明数据类型
VB中,你可以这样写:
Dim i,mystr 它们都默认成variant,但这在FB中是行不通的。这样写编译器百分百报错。
(4) 数字类型
FB中没有currency,所以遇到currency,只能使用longint/10000进行转换。
currency和longint一样,都是8字节。
vb中integer表示短整数,而FB中使用short,好在这种类型使用频率不高,一般用long代替。
但integer在FB中重要得多了,它是一个智能指针,在32位中=Long,在64位中=longint
这相当于VBA中的longptr类型,所以如果你要写32位和64位通用的,一般使用integer
但如果你需要固定大小的数据就使用long或longint,它们不管32位还是64位,大小都是固定的。
(5)全局变量声明不同
在vb中声明全局变量一般是public mystr As String
vb中的全局一般是指一个工程。
但在FB中声明全局变量要麻烦得多了,用dim share i As long。而且这个全局变量的范围
是指一个文件,指的是在这个文件中所有函数或类,都能使用share定义的公共变量。
如果超出这个文件的范围,必须通用#include引用或在另一个文件中另外声明。
我确实见过有人把一整个程序都写在一个文件当中,这在VB是无法想象的。
(6)函数和过程写法的差别:
1) 函数必须先声明,然后再定义
用惯了VB,你可能觉得很别扭。
FB中,一般都先声明函数或类,然后再开始写函数
如:declare Function add( a As long,b As Long ) As Long
然后开始写
Function add( a As Long ,b As Long ) As Long
function=a+b
End Function
如果没有声明函数,会出现什么情况呢:
FB一个模块文件中代码是从上到下顺序执行的。如果你要调用的函数,
是写在本函数的后面,那么本函数无法调用那个写在后面的函数,因为它是顺序执行的。
声明过的函数,可以随意调用任何位置的函数。而且声明的函数,最后我们会把它组织成
头文件,然后在各个地方调用。所以函数(过程)都要先声明,再写函数体。
返回函数值方式有点不一样:
VB只有一种,那就是函数名=返回值
FB有三种,一种和VB是一样的,函数名=返回值,一种是function=返回值,第三种是 Return 返回值。
2) stdcall和cdecl协议
在VB中模块中所有的函数或过程,都只能stdcall,你写不了cdecl,事实上,你在vb中要
调用cdecl的dll函数,极其不容易。
FB支持所有c支持的协议,当然最常用是stdcall和cdecl协议。
在windows上FB默认使用stdcall,在linux上默认使用cdecl。
当然你可以显式指定协议。
Function cdecl add( a As long,b As long) As Long
3) 可选参数,命名参数,数组参数
很不幸,这在VB中很随意常见的东西,目前在FB中还没有实现,现在已经提上日程,
但什么时候实现还未知。
FB中使用可选参数,不能使用optional,而是只能使用overload来写带可选参数的函数
FB中目前没有命名参数 :=这个目前还无法使用。
FB也没有paramArray这样的数组参数用来表示不确定参数,但FB有不定参数…,这用法
和c是一样的,只能使用cdecl协议,不能在stdcall中使用不定参数。更糟糕的是在64位编
译器中,也没有实现不定参数…,因为64位中,不再使用stdcall和cdecl这样的协议了。
我们只能希望FB能早点实现optional ,:=,数组参数了。
当然如果你水平够高的话,FB也是能使用的,通过宏拓展调用一维数组,进行参数传递
optinal,:= 和paramArray都没有问题。
4) 短路逻辑 AndAlso,OrEsle,位操作,位左移,位右移,bit操作,bin二进制数据类型
一般来说FB会比VB多一些内容,也就是底层操作方面会更细,毕竟FB是兼容c的,
这个在具体使用中慢慢体会吧。
FB和VB在语法和语义上的差别,以后再慢慢整理吧