macro expansion, answered by Yantao Xie 真的让我大开眼界!
我还发现下面的教程附带了一些具体的例子,这有助于理解变量范围的概念。
引用自Learn cmake in 15 mins:
在 CMake 中,您可以使用一对function/endfunction 命令来定义一个函数。这是一个将其参数的数值翻倍,然后打印结果的方法:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
函数在它们自己的范围内运行。函数中定义的变量都不会污染调用者的作用域。如果要返回值,可以将变量的名称传递给函数,然后使用特殊参数PARENT_SCOPE 调用set 命令:
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