5

我在这里问了一个关于 cmake 和传递变量的问题。我可以让它工作,但前提是我在函​​数中命名我的变量与我调用该函数的父范围中的变量不同。所以本质上:

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

这不是有点奇怪吗?发生了什么?我认为函数的行为不应该取决于父范围内变量的命名 - 应该吗?!

任何澄清都非常感谢!

4

2 回答 2

8

不幸的是,CMake 的语言非常原始。在这种情况下,局部变量的命名可能会与外部范围内的同名变量交互。

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

除了在函数中使用混淆变量名接受变量名作为参数外,我不知道有任何解决方法。

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

于 2013-01-18T11:22:58.190 回答
4

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

从以下文档macro

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

如果您更改为 use macro,您的输出将变为

-- name
-- foo
-- anothername
-- foo
于 2013-01-19T05:14:47.030 回答