CMake参数传递,按值传递?引用?或者是其他东西?

时间:2019-07-10 03:18:17

标签: cmake cmake-language

我有2个CMake脚本:

Script1.cmake:

cmake_minimum_required(VERSION 3.15)

macro(m1)
message("[DEBUG1] " ${var1})
m2(var1)  #<====================== HERE is different
endmacro(m1)


macro(m2 var2)
message("[DEBUG2] " ${var2})
set(${var2} "set from m2")
endmacro()


m1()
message("[DEBUG3] " ${var1})

Script2.cmake:

cmake_minimum_required(VERSION 3.15)

macro(m1)
message("[DEBUG1] " ${var1})
m2("var1")  #<====================== HERE is different
endmacro(m1)


macro(m2 var2)
message("[DEBUG2] " ${var2})
set(${var2} "set from m2")
endmacro()


m1()
message("[DEBUG3] " ${var1})

我用cmake -P运行它们。它们都给出相同的输出:

[DEBUG1]
[DEBUG2] var1
[DEBUG3] set from m2

对于[DEBUG1],我可以解释一下,因为尚未定义var1。因此${var1}解决不了。

但是对于[DEBUG2]传入var1"var1" 怎么可能一样?

  • 对于传递"var1",我认为结果在逻辑上是合理的。

  • 但是,为了传递var1,我实际上是将一些不存在的变量传递给宏m2。我认为应该有一些错误,因为尚未定义变量。但是实际上CMake可以正常工作。并且${var2}解析为var1的名称。

我之前做了一些C ++编程,我可以理解通过引用传递的参数 或通过值传递传递的参数 。但是似乎没有一种解释适合这里。似乎正在发生一些隐式转换。

1 个答案:

答案 0 :(得分:1)

正如@Justin所说,foo(a)foo("a")是同一件事。

但是当传递列表作为参数时,您可以看到区别。当你写

foo(a b c d)

这变成foo("a;b;c;d")。例如,当您使用源文件列表调用add_executable时,就会发生这种情况。 ;符号是CMake用于分隔列表项的特殊符号。而且,CMake list()命令基本上对纯字符串进行操作,将;与项目本身一起附加或删除。

现在,如果您写

foo("a b c d")

您传递带有空格的单个字符串,而不是包含4个元素的列表。