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 элементов.

Другие вопросы по тегам