Макророзширення відповіли 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
ви повернетесь не з макросу, а з функції, що викликає.