cmake 中除了 if 条件判断之外,还支持循环语句,包括 foreach()循环、while()循环。
foreach 循环
1、foreach 基本用法
foreach 循环的基本用法如下所示:
foreach(loop_var arg1 arg2 ...)
command1(args ...)
command2(args ...)
...
endforeach(loop_var)
endforeach 括号中的可写可不写,如果写了,就必须和 foreach 中的一致。
参数 loop_var 是一个循环变量,循环过程中会将参数列表中的变量依次赋值给他,类似于 C 语言 for 循环中经常使用的变量 i。
# foreach 循环测试
foreach(loop_var A B C D)
message("${loop_var}")
endforeach()
打印信息为:
A
B
C
D
使用 foreach 可以编译一个列表中的所有元素,如下所示:
# foreach 循环测试
set(my_list hello world china)
foreach(loop_var ${my_list})
message("${loop_var}")
endforeach()
打印信息如下:
2、 foreach 循环之 RANGE 关键字
用法如下所示:
foreach(loop_var RANGE stop)
foreach(loop_var RANGE start stop [step])
对于第一种方式,循环会从 0 到指定的数字 stop,包含 stop,stop 不能为负数。
而对于第二种,循环从指定的数字 start 开始到 stop 结束,步长为 step,不过 step 参数是一个可选参数, 如果不指定,默认 step=1;三个参数都不能为负数,而且 stop 不能比 start 小。
接下来我们进行测试,测试一:
# foreach 循环测试
foreach(loop_var RANGE 4)
message("${loop_var}")
endforeach()
打印信息如下:
测试二:
# foreach 循环测试
foreach(loop_var RANGE 1 4 1)
message("${loop_var}")
endforeach()
打印信息如下:
3、foreach 循环之 IN 关键字
用法如下:
foreach(loop_var IN [LISTS [list1 [...]]]
[ITEMS [item1 [...]]])
循环列表中的每一个元素,或者直接指定元素。
接下来进行测试,测试一:
# foreach 循环测试
set(my_list A B C D)
foreach(loop_var IN LISTS my_list)
message("${loop_var}")
endforeach()
打印信息如下:
测试二:
# foreach 循环测试
foreach(loop_var IN ITEMS A B C D)
message("${loop_var}")
endforeach()
打印信息同上。
while 循环
while 循环用法如下:
while(condition)
command1(args ...)
command1(args ...)
...
endwhile(condition)
endwhile 括号中的 condition 可写可不写,如果写了,就必须和 while 中的 condition 一致。
cmake 中 while 循环的含义与 C 语言中 while 循环的含义相同,但条件 condition 为真时,执行循环体中的命令,而条件 condition 的语法形式与 if 条件判断中的语法形式相同。
# while 循环测试
set(loop_var 4)
while(loop_var GREATER 0)
message("${loop_var}")
math(EXPR loop_var "${loop_var} - 1")
endwhile()
输出结果如下:
上例中,while 循环的条件是(loop_var GREATER 0),等价于(loop_var > 0),当 loop_var 变量的有效数值大于 0 时,执行 while 循环体;在 while 循环体中使用到了 cmake 中的数学运算命令 math()。
在 while 循环体中,打印 loop_var,之后将 loop_var 减一。
break、continue
cmake 中,也可以在循环体中使用类似于 C 语言中的 break 和 continue 语句。
1、break
break()命令用于跳出循环,和在 C 语言中的作用是一样的,测试如下:
# while...break 测试
set(loop_var 10)
while(loop_var GREATER 0) #loop_var>0 时 执行循环体
message("${loop_var}")
if(loop_var LESS 6) #当 loop_var 小于 6 时
message("break")
break() #跳出循环
endif()
math(EXPR loop_var "${loop_var} - 1")#loop_var--
endwhile()
打印信息如下:
2、continue
continue()命令用于结束本次循环,执行下一次循环,测试如下:
# while...continue 测试
# 打印所有偶数
set(loop_var 10)
while(loop_var GREATER 0) #loop_var>0 时 执行循环体
math(EXPR var "${loop_var} % 2") #求余
if(var EQUAL 0) #如果 var=0,表示它是偶数
message("${loop_var}") #打印这个偶数
math(EXPR loop_var "${loop_var} - 1")#loop_var--
continue() # 执行下一次循环
endif()
math(EXPR loop_var "${loop_var} - 1")#loop_var--
endwhile()
这段 cmake 代码是求 0 到 10 之间的偶数(左闭右开),并将偶数打印出来,使用到了 continue()命令, 代码不再解释,注释已经写得很清楚了。 打印结果如下:
关于 break()和 continue()命令的使用就介绍到这里了。