我有 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
and"var1"
呢?
对于通过
"var1"
,我认为结果在逻辑上是合理的。但是对于传递
var1
,我实际上是将一些不存在的变量传递给宏m2
。我认为应该有一些错误,因为该变量尚未定义。但实际上 CMake 工作正常。并${var2}
解析为var1
.
我之前做过一些 C++ 编程,我可以理解 pass argument by reference或 pass argument by value。但似乎这两种解释都不适合这里。似乎发生了一些隐式转换。