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
會迭代從 <start>
到最多 <stop>
的數字,以 <step>
為步長。如果沒有指定 <step>
,則步長為 1。三個引數 <start>
<stop>
<step>
必須都是非負整數,且 <stop>
不得小於 <start>
;否則您將進入可能在未來版本中變更的未記載行為的危險區域。
foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])
在這個變體中,<lists>
是一個以空格或分號分隔的清單值變數清單。foreach
命令會迭代每個給定清單中的每個項目。在 ITEMS
關鍵字之後的 <items>
會以 foreach
命令的第一個變體中的方式處理。 LISTS A
和 ITEMS ${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=