Written by rdc
范围是指变量的可见性,您可以在其中访问程序中的变量。在了解不同级别的范围之前,您需要了解FreeBasic中程序的结构。
程序结构
一个完整的程序由一个或多个.bas文件组成,称为模块。每个模块都可以包含模块级代码和子程序和函数中包含的代码。模块级代码是包含在子程序或函数中的
not 的代码。以下片段说明了模块的各个部分。
Dim aInt As Integer 'Variable declared at module level
Sub DoSomething
Dim aInt As Integer 'Variable declared at sub level
... 'This code is local to sub
End Sub
Function DoSomethingElse() As Integer
Dim aInt As Integer 'Variable declared at func level
... 'This code is local to func
End Function
'Module level code
aInt = 5
DoSomething
aInt = DoSomethingElse()
局部变量
如果您在模块级别定义变量(而不是使用
Shared),则该变量称为具有本地模块级别的作用域。模块级代码是可见的,但不是模块中的任何子程序或函数。在上面的示例中,模块变量
aInt只对模块级代码可见。
在子例程或函数中定义的变量是子程序或函数的局部变量,对于模块级代码或任何其他子程序或函数都不可见。
控制结构中定义的变量
在If,For-Next,While-Wend和Do-Loop结构中定义的变量是控制结构块代码的局部变量。也就是说,它们在控件块的开始和结束边界之外不可见,就像在子程序或函数中声明的变量一样。
共享变量
在这个例子中,如果你想要在子程序或函数中看到
aInt,你需要声明变量为
Shared,然后在任何子程序,函数或控制块中声明一个名称相同的变量。
Shared变量对于模块级代码,子程序或功能级代码以及控制结构块可见。
范围冲突
在上面的代码片段中,如果
aInt被声明为
Shared,并且每个子例程和函数声明为
aInt,将存在一个范围冲突,因为有一个变量名称用于不同级别的范围。
编译器通过考虑当前作用域并映射该范围内的变量来解决此问题。由于子程序和函数的范围比模块的范围低,所以
aInt将引用在子程序或函数中声明的变量,而不是在模块级别声明的变量,即使它被声明为共享变量。
多个模块
范围限于单个模块,即单个.bas文件。然而,有时需要将范围从一个模块扩展到另一个模块。当您声明需要在模块之间共享的变量时,您将使用
Common语句。
每个模块必须具有相同的
Common声明,以便编译器匹配公共变量。如果您将module1中的变量声明为
Common aInt as Integer,那么module2也必须具有
Common aInt as Integer.没有公共声明
aInt在module2中不可见。
您可以将
Common属性
Common添加到
Common Shared,不仅可以将范围扩展到多个模块,还可以扩展模块中的范围。
Common Shared与单一模块中的操作与
Shared相同。与
Common一样,您需要在需要访问变量的每个模块中具有匹配的声明。
您可以使用
ScopeEnd Scope关键字创建临时作用域块。创建多行宏时,范围块非常有用,您可能需要创建一些临时工作变量,但不希望在程序中引入名称冲突。以下代码片段说明了如何创建范围块。
Scope
Dim tmp As Integer
... 'Some code
End Scope
范围块内创建的任何变量的范围仅限于块本身。但是,范围块继承了周围范围的可见性,因此与范围块相同范围创建的变量在块内可见。
例如,如果您有一个位于模块级别的范围,并且范围块位于模块级别范围,则
aInt将在范围块内部可见。除非当然有一个范围冲突,在这种情况下,范围块内的变量将覆盖范围块外的相同名称的变量。
范围不仅可以设置变量的可见性,还可以确定变量的生命周期。变量在其一生中经历了几个阶段;创建,初始化,访问和销毁。当这种情况发生时,取决于变量的范围,也就是在程序中定义变量的位置。
模块级变量
由于程序的主体内部声明了程序的使用寿命,因此存在模块级变量。模块级代码是程序的主要执行代码,程序结束时终止。
子程序和功能级别变量
只要程序在子程序和函数的正文内,子程序和函数中声明的变量就会存在。在输入sub / func时,变量被创建,初始化,可以在sub / func中访问。子程序或函数退出后,变量被破坏。
静态变量
声明的sub / func变量的一个例外是
Static变量。
Static变量在对子例程或函数的调用之间保持它们的值,因此具有模块级的使用寿命。
控制块变量
只要控制块正在执行,在控制块中声明的变量(如For-Next)就会存在。离开控制块后,变量被破坏。
范围...结束范围变量
只要范围块存在,范围块中声明的变量才会存在。一旦程序离开范围块,则在范围块内创建的任何变量都将被销毁。