У меня есть 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 ++, и я могу понять, передать аргумент по ссылке или передать аргумент по значению . Но, похоже, ни одно из объяснений здесь не подходит. Кажется, что происходит неявное преобразование.