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 包含超出最后一个预期参数的参数列表。引用超出 ARGCARGV# 参数具有未定义行为。检查 ARGC 是否大于 # 是确保 ARGV# 作为额外参数传递给函数的唯一方法。

另请参阅