Rozszerzenie makro, na które odpowiedział Yantao Xie, naprawdę otwiera mi oczy!
Zauważyłem również, że poniższy samouczek zawiera kilka konkretnych przykładów, które są pomocne w zrozumieniu pojęcia zakresu zmiennych.
Cytowane z Learn cmake w 15 minut :
W CMake możesz użyć pary plików function
endfunction
poleceń / do zdefiniowania funkcji. Oto przykład, który podwaja wartość liczbową swojego argumentu, a następnie wyświetla wynik:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Funkcje działają we własnym zakresie. Żadna ze zmiennych zdefiniowanych w funkcji nie zanieczyszcza zakresu wywołującego. Jeśli chcesz zwrócić wartość, możesz przekazać nazwę zmiennej do swojej funkcji, a następnie wywołać set
polecenie ze specjalnym argumentemPARENT_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
Podobnie, para macro
/endmacro
poleceń definiuje makro. W przeciwieństwie do funkcji makra działają w tym samym zakresie co ich obiekt wywołujący. Dlatego wszystkie zmienne zdefiniowane wewnątrz makra są ustawiane w zakresie wywołującego. Możemy zastąpić poprzednią funkcję następującą:
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
Zarówno funkcje, jak i makra akceptują dowolną liczbę argumentów. Nienazwane argumenty są przedstawiane funkcji jako lista za pośrednictwem specjalnej zmiennej o nazwieARGN
.
Oto funkcja, która podwaja każdy otrzymany argument, wypisując każdy z nich w osobnym wierszu:
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
imacro
: semantykareturn()
: Gdy zostanie użyta w amacro
, nie powrócisz z makra, ale z funkcji wywołującej.