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=