foreach
为列表中的每个值计算一组命令。
foreach(<loop_var> <items>)
<commands>
endforeach()
其中< items >是用分号或空格分隔的项列表。foreach和匹配的endforeach之间的所有命令都被记录,而没有被调用。一旦endforeach被求值,记录的命令列表将为< items >中的每个项调用一次。在每次迭代开始时,变量< loop_var >将被设置为当前项的值。
< loop_var >的作用域被限制为循环作用域。详见政策CMP0124。
命令break()和continue()提供了逃离常规控制流的方法。
每个遗留的endforeach()命令允许一个可选的参数。如果使用,它必须完全重复打开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关键字后面的处理方式与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命令对每个列表进行迭代,同时设置迭代变量,如下所示:
- 如果只给出循环变量,则它将一系列循环变量从相应的列表中设置为当前项;
- 如果传递了多个变量名,它们的计数应该与变量计数列表匹配;
- 如果任何一个列表较短,则不会为当前迭代定义相应的迭代变量。
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=
endforeach
在foreach块中结束命令列表。
endforeach([<loop_var>])
参见foreach()命令。
可选的< loop_var >参数只支持向后兼容。如果使用它,它必须完全重复foreach子句开头的参数。