作为一个编程语言,CMake也少不了循环流程控制,他提供两种循环foreach()
和 while()
。
一、foreach()
基本语法:
foreach(<loop_var> <items>)
<commands>
endforeach()
其中<items>
可以是由分号或空格分隔的项目列表,也可以是一个列表变量。每次迭代,<loop_var>
将被赋值为当前项目的值。
set(item1 a)
set(item2 b)
set(item3 c)
set(item4 d)
foreach(var ${item1} ${item2} ${item3} ${item4})
message("var = ${var}")
endforeach()
----------------
var = a
var = b
var = c
var = d
var = e
set(myList 1 2 3 4)
foreach(var ${myList})
message("var = ${var}")
endforeach()
----------------
var = 1
var = 2
var = 3
var = 4
foreach()
还有一些进阶的用法:
-
foreach(<loop_var> RANGE <stop>)
使用
<stop>
指定迭代范围(<stop>
> 0),相当于有一个迭代变量i
,迭代范围为[0, <stop>]
。foreach(var RANGE 5) message("var = ${var}") endforeach() ---------------- var = 0 var = 1 var = 2 var = 3 var = 4 var = 5
-
foreach(<loop_var> RANGE <start> <stop> [<step>])
指定迭代范围的开始(
<start>
)和结束(<stop>
),并可选指定步长(<step>
)。foreach(var RANGE 2 10 2) message("var = ${var}") endforeach() ---------------- var = 2 var = 4 var = 6 var = 8 var = 10
-
foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])
它和
foreach(<loop_var> <items>)
的用法基本一样,唯一不同的是,用LISTS
指定列表后不需要用${}
对列表进行取值。set(myList 1 2 3 4) foreach(var IN LISTS myList) message("var = ${var}") endforeach() ---------------- var = 1 var = 2 var = 3 var = 4
-
foreach(<loop_var>... IN ZIP_LISTS <lists>)
CMake 3.17引入
这个用法可以并行遍历多个列表,可以发现
<loop_var>
后面有...
,所以他可以传入多个变量以接受多个列表的遍历,传入多个变量时,变量的数量应该和列表的数量相同。但如果只传入一个变量,将会把对应列表的元素存入到
<loop_var>_N
中,如下:set(myList0 a b c d) set(myList1 1 2 3 4) # 传入多个变量 foreach(var0 var1 IN ZIP_LISTS myList0 myList1) message("var0 = ${var0}, var1 = ${var1}") endforeach() ---------------- var1 = a, var2 = 1 var1 = b, var2 = 2 var1 = c, var2 = 3 var1 = d, var2 = 4 # 传入一个变量 set(myList0 a b c d) set(myList1 1 2 3 4) foreach(var IN ZIP_LISTS myList0 myList1) message("var_0 = ${var_0}, var_1 = ${var_1}") endforeach() ---------------- var_0 = a, var_1 = 1 var_0 = b, var_1 = 2 var_0 = c, var_1 = 3 var_0 = d, var_1 = 4
二、while()
基本语法:
while(<condition>)
<commands>
endwhile()
如果 <condition>
为真,则执行循环,示例如下:(列表操作详见CMake列表 - list)文章来源:https://www.toymoban.com/news/detail-698621.html
list(LENGTH myList listLen)
while(listLen GREATER 0)
message("myList = ${myList}")
list(POP_FRONT myList)
list(LENGTH myList listLen)
endwhile()
----------------
myList = 1;2;3;4
myList = 2;3;4
myList = 3;4
myList = 4
三、break() 与 continue()
与绝大多数编程语言一样,CMake也可以通过 break()
跳出循环,通过 continue()
结束本次循环并继续下次循环。文章来源地址https://www.toymoban.com/news/detail-698621.html
set(myList 1 2 3 4 5 6 7)
foreach(var IN LISTS myList)
math(EXPR expr ${var}%2)
if(expr EQUAL 0)
continue()
endif()
if(${var} GREATER 5)
break()
endif()
message("var = ${var}")
endforeach()
----------------
var = 1
var = 3
var = 5
到了这里,关于[CMake教程] 循环的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!