奇怪的函数参数名称行为

nan*_*loo 5 cmake

在这里询问了有关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)

这不是有点奇怪吗?发生了什么?我认为函数的行为不应该依赖于父作用域中变量的命名 - 它应该吗?!

非常感谢任何澄清!

Lin*_*cer 8

不幸的是,CMake的语言非常原始.在这种情况下,局部变量的命名可以与外部作用域中具有相同名称的变量进行交互.

具体地说,在两个调用中分别${${name}}扩展为${name}${anothername}.前者name是使用其值的局部变量的名称.在后者中,使用anothername来自外部范围.

除了在函数接受变量名称中使用模糊变量名作为参数之外,我不知道有什么办法.

也许我们应该向${name:PARENT_SCOPE}CMake团队请愿?