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# 作为额外参数传递给函数的唯一方法。