La macro expansión, respondida por Yantao Xie realmente me abre los ojos!
También encontré que el tutorial a continuación viene con algunos ejemplos concretos, lo cual es útil para comprender el concepto de alcance variable.
Citado de Learn cmake en 15 minutos :
En CMake, puede usar un par de comandos function
/ endfunction
para definir una función. Aquí hay uno que duplica el valor numérico de su argumento y luego imprime el resultado:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Las funciones se ejecutan en su propio ámbito. Ninguna de las variables definidas en una función contamina el alcance de la persona que llama. Si desea devolver un valor, puede pasar el nombre de una variable a su función, luego llamar alset
comando con el argumento especial 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
Del mismo modo, un par de macro
endmacro
comandos / define una macro. A diferencia de las funciones, las macros se ejecutan en el mismo ámbito que su llamador. Por lo tanto, todas las variables definidas dentro de una macro se establecen en el alcance del llamador. Podemos reemplazar la función anterior por la siguiente:
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
Tanto las funciones como las macros aceptan un número arbitrario de argumentos. Los argumentos sin nombre se exponen a la función como una lista, a través de una variable especial llamadaARGN
.
Aquí hay una función que duplica cada argumento que recibe, imprimiendo cada uno en una línea separada:
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
ymacro
: la semántica dereturn()
: Cuando se usa en amacro
, no regresará de la macro sino de la función de llamada.