变量作用域
- Source: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgVariableScope
- Last revised: 2019-08-25
变量和对象的可见性与访问规则
变量的作用域是指它在程序中的可见性。变量在其声明所在的作用域之外不可见(无法被访问)。变量声明的位置和方式决定了其作用域。
在 FreeBASIC 中,作用域分为 4 类:局部(local)、共享(shared)、公共(common) 和 公共共享(common shared)。每种作用域都有不同的可见性规则,详述如下。
局部作用域
在局部作用域中声明的变量,只在其所声明的最内层 IF、SELECT、WITH、FOR、WHILE、DO、SCOPE、过程或模块块中可见。
Sub、Function、主程序体以及每个复合语句都隐式定义了一个新的局部作用域块。- 使用
Dim、Redim或Static显式声明的变量,其作用域为声明所在的最内层块。 - 隐式变量的作用域为其首次使用的最内层
Scope...End Scope块,否则为其所在的Sub、Function或主程序体的作用域。
在局部作用域中,模块级代码与过程级代码之间不互相可见。此外,在块语句或循环语句内部声明的变量,只在该块内可见。在模块局部作用域中声明的变量,对该模块内的任何过程均不可见。同样,在过程内部声明的局部变量,对模块级代码以及模块内其他过程也不可见。
在 Scope 块内声明的变量只能是局部作用域,且在该块外不可见。但 Scope 块会继承外层作用域,因此在 Scope 块外声明的局部变量在块内是可见的(参见示例程序)。
可以使用 Dim 语句显式声明局部作用域变量,或在 -lang qb 和 -lang fblite 方言中通过直接引入变量来隐式声明(参见 隐式声明)。示例程序 local.bas 演示了局部作用域的可见性规则。
local.bas
start GeSHi
'' 仅在本模块中可见
Dim As Integer local_moduleLevel1
'' OK.
Print local_moduleLevel1
Scope
'' OK;SCOPE 块继承外层作用域
Print local_moduleLevel1
'' 仅在此 SCOPE 块中可见
Dim As Integer local_moduleLevel2
'' OK.
Print local_moduleLevel2
End Scope
'' 错误;无法访问内层 SCOPE 变量
'' print local_moduleLevel2
Function some_function( ) As Integer
'' 仅在此函数中可见
Dim As Integer local_functionLevel
'' OK.
Print local_functionLevel
'' 错误;无法访问局部模块级变量
'' print local_moduleLevel1
'' 错误;无法访问局部模块级变量
'' print local_moduleLevel2
Function = 0
End Function
'' print local_functionLevel '' 错误;无法访问函数级变量
End 0end GeSHi
共享作用域
在模块共享作用域中声明的变量,对该模块及其所有过程均可见。
与局部作用域不同,共享作用域使模块级变量对该模块的过程可见。换言之,模块将其声明与其过程共享。
变量只能在模块级声明为共享作用域。即,只有模块才能共享变量。过程和 Scope 块不能在共享作用域中声明变量,因此在其中声明的变量只能是该过程或块的局部变量。
可以使用带 Shared 关键字的 DIM(或 REDIM 或 STATIC)语句将变量声明为共享作用域。示例程序 shared_scope.bas 演示了共享作用域的可见性规则。
shared.bas
start GeSHi
'' 在整个模块中可见
Dim Shared As Integer shared_moduleLevel1
'' OK.
Print shared_moduleLevel1
Scope
'' OK;可以访问外层作用域变量
Print shared_moduleLevel1
'' 错误;SCOPE 级变量不能声明为 shared
'' dim shared as integer shared_ModuleLevel2
End Scope
End 0
Function some_function( ) As Integer
'' OK;可以访问 shared 的模块级变量
Print shared_moduleLevel1
'' 错误;函数级变量不能声明为 shared
'' dim shared as integer sharedFunctionLevel
Function = 0
End Functionend GeSHi
公共作用域
在公共作用域中声明的变量对所有模块可见。
使用 Common 声明的变量,对其他具有匹配 Common 变量声明的模块可见。各模块间声明的变量名必须匹配。
module1.bas
start GeSHi
'' 编译命令:
'' fbc -lang qb module1.bas module2.bas
'$lang: "qb"
Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer
' 此处在所有其他模块之后执行
m1 = 1
Print "Module1"
Print "m1 = "; m1 ' m1 = 1,在本模块中赋值
Print "m2 = "; m2 ' m2 = 2,在 module2 中赋值
Print_Valuesend GeSHi
module2.bas
start GeSHi
Common m1 As Integer
Common m2 As Integer
m2 = 2
Print "Module2" ' 此处最先执行
Print "m1 = "; m1 ' m1 = 0(默认值)
Print "m2 = "; m2 ' m2 = 2
Sub Print_Values()
Print "Module2.Print_Values"
Print "m1 = "; m1 ' 隐式变量 = 0,因使用 '-lang qb'
Print "m2 = "; m2 ' 隐式变量 = 0,因使用 '-lang qb'
End Subend GeSHi
输出:
Module2
m1 = 0
m2 = 2
Module1
m1 = 1
m2 = 2
Module2.Print_Values
m1 = 0
m2 = 0公共共享作用域
在公共共享作用域中声明的变量,对所有模块及其所有过程均可见。
使用 Common 声明的变量,对其他具有匹配 Common 变量声明的模块可见。各模块间声明的变量名必须匹配。在模块内,Shared 声明修饰符使变量具有模块作用域,并对所有 Sub 和 Function 可见。
module3.bas
start GeSHi
'' 编译命令:
'' fbc module3.bas module4.bas
Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer
'' 此处在所有其他模块之后执行
m1 = 1
Print "Module3"
Print "m1 = "; m1 '' m1 = 1,在本模块中赋值
Print "m2 = "; m2 '' m2 = 2,在 module4 中赋值
Print_Valuesend GeSHi
module4.bas
start GeSHi
Common Shared m1 As Integer
Common Shared m2 As Integer
m2 = 2
Print "Module4" '' 此处最先执行
Print "m1 = "; m1 '' m1 = 0(默认值)
Print "m2 = "; m2 '' m2 = 2
Sub Print_Values()
Print "Module4.Print_Values"
Print "m1 = "; m1 '' m1 = 1
Print "m2 = "; m2 '' m2 = 2
End Subend GeSHi
输出:
Module4
m1 = 0
m2 = 2
Module3
m1 = 1
m2 = 2
Module4.Print_Values
m1 = 1
m2 = 2示例
见上述各示例。
另请参阅
ScopeDimCommonShared- 变量
- 隐式声明
- 简单变量生命周期与作用域
- 动态对象与数据生命周期
返回 目录