我在这里询问了有关cmake和传递变量的问题.我可以使它工作,但只有当我在函数中命名我的变量不同于父作用域中的变量时,我才调用函数.所以本质上:
function(strange name)
message(STATUS ${name})
message(STATUS ${${name}})
endfunction()
set(name foo)
set(anothername foo)
strange(name)
strange(anothername)
Run Code Online (Sandbox Code Playgroud)
结果如下:
-- name (message(STATUS ${name}) for var "name")
-- name (message(STATUS ${${name}}) for var "name")
-- anothername message(STATUS ${name}) for var "anothername")
-- foo (message(STATUS ${${name}}) for var "anothername")
Run Code Online (Sandbox Code Playgroud)
这不是有点奇怪吗?发生了什么?我认为函数的行为不应该依赖于父作用域中变量的命名 - 它应该吗?!
非常感谢任何澄清!
不幸的是,CMake的语言非常原始.在这种情况下,局部变量的命名可以与外部作用域中具有相同名称的变量进行交互.
具体地说,在两个调用中分别${${name}}扩展为${name}和${anothername}.前者name是使用其值的局部变量的名称.在后者中,使用anothername来自外部范围.
除了在函数接受变量名称中使用模糊变量名作为参数之外,我不知道有什么办法.
也许我们应该向${name:PARENT_SCOPE}CMake团队请愿?