奇怪的函数参数名称行为

时间:2013-01-18 10:48:28

标签: cmake

我问了一些关于cmake和传递变量的问题here。我可以使它工作,但只有当我在函数中命名我的变量不同于父作用域中的变量时,我才调用函数。所以本质上:

function(strange name)
   message(STATUS ${name})
   message(STATUS ${${name}})
endfunction()

set(name foo)
set(anothername foo)
strange(name)
strange(anothername)

结果是:

-- 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")

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

非常感谢任何澄清!

1 个答案:

答案 0 :(得分:3)

如果您想避免@ Lindydancer简明回答中描述的本地范围问题,您可以将您的功能更改为macro

来自macro的文档:

  

请注意,宏的参数和ARGN等值不是通常CMake意义上的变量。它们是字符串替换,就像c预处理器与宏一样。如果你想要真正的CMake变量,你应该看一下函数命令。

如果您更改为使用macro,则输出将变为

-- name
-- foo
-- anothername
-- foo