0

我有 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]怎么会一样传入var1and"var1"呢?

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

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

我之前做过一些 C++ 编程,我可以理解 pass argument by reference或 pass argument by value。但似乎这两种解释都不适合这里。似乎发生了一些隐式转换。

4

1 回答 1

1

正如@Justin所说,foo(a)并且foo("a")是一回事。

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

foo(a b c d)

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

现在,如果你写

foo("a b c d")

你传递一个带空格的字符串,而不是 4 个元素的列表。

于 2019-07-10T07:00:09.777 回答