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 A 和 ITEMS ${A} 是等效的。如果没有提供 <lists> 或 <items>,循环体将永远不会执行(即它被处理为空)。
以下示例展示了如何处理 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变量设置为来自相应列表的当前项目;如果传递了多个变量名,它会将每个变量设置为来自相应列表的当前项目。迭代变量的数量必须与列表变量的数量相匹配。
如果没有提供 <lists>,循环体将永远不会执行(即它被处理为空)。
以下示例展示了如何处理 ZIP_LISTS 选项
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=