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 до неотрицательного целого числа <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> или <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=
См. также
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/foreach.html