Макрорасширения ответили Yantao С действительно открывает мне глаза!
Я также обнаружил, что в приведенном ниже руководстве есть несколько конкретных примеров, которые помогают понять концепцию области видимости переменных.
Цитируется по Learn cmake за 15 минут :
В CMake вы можете использовать пару команд function
/ endfunction
для определения функции. Вот тот, который удваивает числовое значение своего аргумента, а затем выводит результат:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Функции выполняются в своей собственной области. Ни одна из переменных, определенных в функции, не загрязняет область действия вызывающего. Если вы хотите вернуть значение, вы можете передать имя переменной своей функции, а затем вызвать set
команду со специальным аргументом PARENT_SCOPE
:
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
Точно так же пара команд macro
/ endmacro
определяет макрос. В отличие от функций, макросы выполняются в той же области, что и их вызывающий объект. Следовательно, все переменные, определенные внутри макроса, устанавливаются в области действия вызывающего. Мы можем заменить предыдущую функцию следующей:
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
И функции, и макросы принимают произвольное количество аргументов. Безымянные аргументы предоставляются функции в виде списка через специальную переменную с именемARGN
.
Вот функция, которая удваивает каждый получаемый аргумент, выводя каждый из них в отдельной строке:
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
function
иmacro
: семантикаreturn()
: при использовании в amacro
вы возвращаетесь не из макроса, а из вызывающей функции.