foreach

为列表中的每个值评估一组命令。

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

其中 <items> 是一个由分号或空格分隔的项目列表。 foreach 和匹配的 endforeach 之间的所有命令都会被记录下来,但不会被调用。一旦 endforeach 被评估,记录的命令列表将为 <items> 中的每个项目调用一次。在每次迭代开始时,变量 <loop_var> 将被设置为当前项目的值。

<loop_var> 的作用域被限制在循环作用域内。 有关详细信息,请参阅策略 CMP0124

命令 break()continue() 提供了跳出正常控制流的方法。

根据传统,endforeach() 命令接受一个可选的 <loop_var> 参数。如果使用,它必须与 opening 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 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=

参见