我有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 ++编程,我可以理解通过引用传递的参数 或通过值传递传递的参数 。但是似乎没有一种解释适合这里。似乎正在发生一些隐式转换。
答案 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个元素的列表。