【发布时间】:2019-11-19 15:00:01
【问题描述】:
我有 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++ 编程,我可以理解传递参数 by reference 或传递参数 by value。但似乎这两种解释都不适合这里。似乎发生了一些隐式转换。
【问题讨论】:
-
CMake 是现存最奇怪的语言之一。在 CMake 中,一切都是字符串。
var和"var"作为参数传递时完全相同;引号只是让您在参数中放置空格等字符。当您使用${var}扩展变量时,这就像在哈希图中查找键,即字符串var。
标签: cmake cmake-language