我有 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。但似乎这两种解释都不适合这里。似乎发生了一些隐式转换。