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