CMake передача аргумента по значению? по ссылке? или что-то другое? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть 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 Ответ

1 голос
/ 10 июля 2019

Как сказал @ Джастин , 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 элементов.

...