foreach

針對列表中的每個值評估一組命令。

foreach(<loop_var> <items>)
  <commands>
endforeach()

其中 <items> 是以分號或空格分隔的項目列表。 foreach 和相符的 endforeach 之間的所有命令都會被記錄下來,而不會被調用。 一旦評估 endforeach,記錄的命令列表將針對 <items> 中的每個項目調用一次。 在每次迭代開始時,變數 <loop_var> 將被設定為目前項目的值。

<loop_var> 的作用域僅限於迴圈作用域。 有關詳細資訊,請參閱策略 CMP0124

命令 break()continue() 提供了從正常控制流程中跳脫的方法。

依照慣例,endforeach() 命令接受一個可選的 <loop_var> 參數。 如果使用,它必須與開頭 foreach 命令的參數完全相同。

foreach(<loop_var> RANGE <stop>)

在此變體中,foreach 迭代數字 0, 1, ... 直到(包含)非負整數 <stop>

foreach(<loop_var> RANGE <start> <stop> [<step>])

在此變體中,foreach<step> 的步長迭代從 <start> 到最多 <stop> 的數字。 如果未指定 <step>,則步長為 1。 三個參數 <start> <stop> <step> 都必須是非負整數,並且 <stop> 不得小於 <start>; 否則您將進入未記錄行為的危險區域,這些行為可能會在未來版本中更改。

foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

在此變體中,<lists> 是以空格或分號分隔的列表值變數列表。 foreach 命令迭代給定列表中的每個項目。 ITEMS 關鍵字後面的 <items> 的處理方式與 foreach 命令的第一種變體相同。 形式 LISTS AITEMS ${A} 是等效的。

以下範例展示了如何處理 LISTS 選項

set(A 0;1)
set(B 2 3)
set(C "4 5")
set(D 6;7 8)
set(E "")
foreach(X IN LISTS A B C D E)
    message(STATUS "X=${X}")
endforeach()

產生

-- X=0
-- X=1
-- X=2
-- X=3
-- X=4 5
-- X=6
-- X=7
-- X=8
foreach(<loop_var>... IN ZIP_LISTS <lists>)

在版本 3.17 中新增。

在此變體中,<lists> 是以空格或分號分隔的列表值變數列表。 foreach 命令同時迭代每個列表,並按如下方式設定迭代變數

  • 如果僅給定一個 loop_var,則它會將一系列 loop_var_N 變數設定為來自相應列表的目前項目;

  • 如果傳遞了多個變數名稱,則它們的計數應與列表變數計數相符;

  • 如果任何列表較短,則目前迭代未定義對應的迭代變數。

list(APPEND English one two three four)
list(APPEND Bahasa satu dua tiga)

foreach(num IN ZIP_LISTS English Bahasa)
    message(STATUS "num_0=${num_0}, num_1=${num_1}")
endforeach()

foreach(en ba IN ZIP_LISTS English Bahasa)
    message(STATUS "en=${en}, ba=${ba}")
endforeach()

產生

-- num_0=one, num_1=satu
-- num_0=two, num_1=dua
-- num_0=three, num_1=tiga
-- num_0=four, num_1=
-- en=one, ba=satu
-- en=two, ba=dua
-- en=three, ba=tiga
-- en=four, ba=

參見