一. 简介
如同 C 语言一样,在 cmake 中,变量也有作用域的概念,本文我们就来聊一聊关于 cmake 中变量作用域的问题。
接下来从三个方面进行介绍:函数作用域、目录作用域以及全局作用域。
我把这个作用域叫做函数作用域。
当在函数内通过
set
将变量
var
与当前函数作用域绑定时,变量
var 仅在函数作用域内有效,出了这个作用域,如果这个作用域外也有同名的变量
var
,那么使用的将是域外同
名变量
var
;
func1()
内部调用
func2()
,嵌套调用的函数
func2()
内部如果也
引用变量
var
,那么该变量
var
应
该是
func1()
内部定义的变量,如果有的话;
如果
func1()
内部没有绑定变量
var
,那么就会使用
func1()
作用
域外定义的变量
var
,依次向外搜索。
以上这段话大家可能不好理解,我们通过几个示例来看看函数作用域。
三. cmake进阶:变量的作用域
1. 函数内部引用函数外部定义的变量
准备一个cmake工程,向顶层 CMakeLists.txt添加如下代码:
# 函数 xyz
function(xyz)
message(${ABC}) #引用变量 ABC
endfunction()
set(ABC "Hello World") #定义变量 ABC
xyz() # 调用函数
ABC
是函数外部定义的一个变量,在函数
xyz
中引用了该变量。
进入 build目录下,运行"cmake .."命令后打印信息如下:
所以可知,函数内可以引用函数外部定义的变量。
向顶层 CMakeLists.txt添加如下代码:
# 函数 xyz
function(xyz)
set(ABC "Hello World")#定义变量 ABC
endfunction()
xyz() # 调用函数
if(DEFINED ABC)
message("true")
message("${ABC}") #引用函数内定义的变量 ABC
else()
message("false")
endif()
函数内定义了变量
ABC
,外部调用函数之后,通过
if(DEFINED ABC)
来判断变量
ABC
是否有定义,如果定义了该变量打印
true
并将变量打印出来,如果没有定义该变量则打印
false
。
进入 build目录下,运行"cmake .."命令后打印信息如下:
所以可知,函数内部定义的变量仅在函数内部可使用,出了函数之后便无效了。
这其实跟
C
语言中差
不多,函数中定义的变量可以认为是局部变量,外部自然是无法去引用的。
下一篇继续从函数作用域方面,学习变量的作用域。