Skip to content

变量作用域


变量和对象的可见性与访问规则

变量的作用域是指它在程序中的可见性。变量在其声明所在的作用域之外不可见(无法被访问)。变量声明的位置和方式决定了其作用域。

FreeBASIC 中,作用域分为 4 类:局部(local)共享(shared)公共(common)公共共享(common shared)。每种作用域都有不同的可见性规则,详述如下。

局部作用域

在局部作用域中声明的变量,只在其所声明的最内层 IF、SELECT、WITH、FOR、WHILE、DO、SCOPE、过程或模块块中可见。

  • SubFunction、主程序体以及每个复合语句都隐式定义了一个新的局部作用域块。
  • 使用 DimRedimStatic 显式声明的变量,其作用域为声明所在的最内层块。
  • 隐式变量的作用域为其首次使用的最内层 Scope...End Scope 块,否则为其所在的 SubFunction 或主程序体的作用域。

在局部作用域中,模块级代码与过程级代码之间不互相可见。此外,在块语句或循环语句内部声明的变量,只在该块内可见。在模块局部作用域中声明的变量,对该模块内的任何过程均不可见。同样,在过程内部声明的局部变量,对模块级代码以及模块内其他过程也不可见。

Scope 块内声明的变量只能是局部作用域,且在该块外不可见。但 Scope 块会继承外层作用域,因此在 Scope 块外声明的局部变量在块内是可见的(参见示例程序)。

可以使用 Dim 语句显式声明局部作用域变量,或在 -lang qb-lang fblite 方言中通过直接引入变量来隐式声明(参见 隐式声明)。示例程序 local.bas 演示了局部作用域的可见性规则。

local.bas

start GeSHi

vb
'' 仅在本模块中可见
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 0

end GeSHi

共享作用域

在模块共享作用域中声明的变量,对该模块及其所有过程均可见。

与局部作用域不同,共享作用域使模块级变量对该模块的过程可见。换言之,模块将其声明与其过程共享

变量只能在模块级声明为共享作用域。即,只有模块才能共享变量。过程和 Scope 块不能在共享作用域中声明变量,因此在其中声明的变量只能是该过程或块的局部变量。

可以使用带 Shared 关键字的 DIM(或 REDIM 或 STATIC)语句将变量声明为共享作用域。示例程序 shared_scope.bas 演示了共享作用域的可见性规则。

shared.bas

start GeSHi

vb
'' 在整个模块中可见
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 Function

end GeSHi

公共作用域

在公共作用域中声明的变量对所有模块可见。

使用 Common 声明的变量,对其他具有匹配 Common 变量声明的模块可见。各模块间声明的变量名必须匹配。

module1.bas

start GeSHi

vb
'' 编译命令:
''    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_Values

end GeSHi

module2.bas

start GeSHi

vb
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 Sub

end 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

vb
'' 编译命令:
''    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_Values

end GeSHi

module4.bas

start GeSHi

vb
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 Sub

end GeSHi

输出:

  Module4
  m1 = 0
  m2 = 2
  Module3
  m1 = 1
  m2 = 2
  Module4.Print_Values
  m1 = 1
  m2 = 2

示例

见上述各示例。

另请参阅

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系