function¶
开始记录一个函数,以便稍后作为命令调用。
function(<name> [<arg1> ...])
<commands>
endfunction()
定义一个名为 <name>
的函数,该函数接受名为 <arg1>
, ... 的参数。函数定义中的 <commands>
会被记录下来;它们在函数被调用之前不会被执行。
根据传统,endfunction()
命令允许一个可选的 <name>
参数。如果使用,它必须与开头的 function
命令的参数完全相同。
函数会开启一个新的作用域:详情请参阅 set(var PARENT_SCOPE)
。
有关函数内部策略的行为,请参阅 cmake_policy()
命令文档。
有关 CMake 函数和宏之间差异,请参阅 macro()
命令文档。
调用¶
函数调用是大小写不敏感的。一个定义为
function(foo)
<commands>
endfunction()
可以通过以下任何一种方式调用
foo()
Foo()
FOO()
cmake_language(CALL foo)
等等。但是,强烈建议坚持在函数定义中选择的大小写。通常,函数使用全小写名称。
在 3.18 版本中新增: cmake_language(CALL ...)
命令也可以用来调用该函数。
参数¶
当函数被调用时,记录的 <commands>
首先会被修改,将形参 (${arg1}
, ...) 替换为传递的实参,然后作为普通命令调用。
除了引用形参之外,你还可以引用 ARGC
变量,它将被设置为传递给函数的参数数量,以及 ARGV0
, ARGV1
, ARGV2
, ...,它们将具有传入参数的实际值。这有助于创建带有可选参数的函数。
此外,ARGV
包含传递给函数的所有参数的列表,而 ARGN
包含超出最后一个预期参数的参数列表。引用超出 ARGC
的 ARGV#
参数具有未定义的行为。检查 ARGC
是否大于 #
是确保 ARGV#
作为额外参数传递给函数的唯一方法。