Die Makro-Erweiterung, die von Yantao Xie beantwortet wurde, öffnet mir wirklich die Augen!
Ich fand auch, dass das folgende Tutorial einige konkrete Beispiele enthält, die hilfreich sind, um das Konzept des variablen Bereichs zu verstehen.
Zitiert von Learn cmake in 15 Minuten :
In CMake können Sie ein Paar function
/ endfunction
Befehle verwenden, um eine Funktion zu definieren. Hier ist eine, die den numerischen Wert ihres Arguments verdoppelt und dann das Ergebnis druckt:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Funktionen laufen in ihrem eigenen Bereich. Keine der in einer Funktion definierten Variablen verschmutzt den Bereich des Aufrufers. Wenn Sie einen Wert zurückgeben möchten, können Sie den Namen einer Variablen an Ihre Funktion übergeben und dann den set
Befehl mit dem speziellen Argument aufrufen 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
In ähnlicher Weise definiert ein Paar von macro
/ endmacro
Befehlen ein Makro. Im Gegensatz zu Funktionen werden Makros im selben Bereich wie ihr Aufrufer ausgeführt. Daher werden alle in einem Makro definierten Variablen im Bereich des Aufrufers festgelegt. Wir können die vorherige Funktion durch folgende ersetzen:
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
Sowohl Funktionen als auch Makros akzeptieren eine beliebige Anzahl von Argumenten. Unbenannte Argumente werden der Funktion als Liste über eine spezielle Variable mit dem Namen angezeigt ARGN
.
Hier ist eine Funktion, die jedes empfangene Argument verdoppelt und jedes in einer separaten Zeile druckt:
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
undmacro
: die Semantik vonreturn()
: Bei Verwendung in amacro
kehren Sie nicht vom Makro zurück, sondern von der aufrufenden Funktion.