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 變數,它將被設定為傳遞給函式的參數數量,以及 ARGV0ARGV1ARGV2、...,它們將具有傳遞參數的實際值。這有助於創建具有可選參數的函式。

此外,ARGV 保留了傳遞給函式的所有參數的列表,而 ARGN 保留了超出最後一個預期參數的參數列表。引用超出 ARGCARGV# 參數具有未定義的行為。檢查 ARGC 是否大於 # 是確保 ARGV# 作為額外參數傳遞給函式的唯一方法。

參見