• [CMake教程] 循环


    作为一个编程语言,CMake也少不了循环流程控制,他提供两种循环foreach()while()

    一、foreach()

    基本语法:

    foreach(<loop_var> <items>)
      <commands>
    endforeach()
    
    • 1
    • 2
    • 3

    其中 可以是由分号或空格分隔的项目列表,也可以是一个列表变量。每次迭代, 将被赋值为当前项目的值。

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    foreach() 还有一些进阶的用法:

    •   foreach(<loop_var> RANGE <stop>)
      
      • 1

      使用 指定迭代范围( > 0),相当于有一个迭代变量i,迭代范围为 [0, ]

      foreach(var RANGE 5)
          message("var = ${var}")
      endforeach()
      ----------------
      var = 0
      var = 1
      var = 2
      var = 3
      var = 4
      var = 5
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    •   foreach(<loop_var> RANGE <start> <stop> [<step>])
      
      • 1

      指定迭代范围的开始()和结束(),并可选指定步长()。

      foreach(var RANGE 2 10 2)
          message("var = ${var}")
      endforeach()
      ----------------
      var = 2
      var = 4
      var = 6
      var = 8
      var = 10
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    •   foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])
      
      • 1

      它和foreach( )的用法基本一样,唯一不同的是,用LISTS指定列表后不需要用 ${}对列表进行取值。

      set(myList 1 2 3 4)
      foreach(var IN LISTS myList)
          message("var = ${var}")
      endforeach()
      ----------------
      var = 1
      var = 2
      var = 3
      var = 4
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    •   foreach(<loop_var>... IN ZIP_LISTS <lists>)
      
      • 1

      CMake 3.17引入

      这个用法可以并行遍历多个列表,可以发现后面有... ,所以他可以传入多个变量以接受多个列表的遍历,传入多个变量时,变量的数量应该和列表的数量相同。

      但如果只传入一个变量,将会把对应列表的元素存入到 _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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24

    二、while()

    基本语法:

    while(<condition>)
    	<commands>
    endwhile()
    
    • 1
    • 2
    • 3

    如果 为真,则执行循环,示例如下:(列表操作详见CMake列表 - list

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三、break() 与 continue()

    与绝大多数编程语言一样,CMake也可以通过 break() 跳出循环,通过 continue() 结束本次循环并继续下次循环。

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    tensorflow跑手写体实验
    毕业设计JSP 2384网上diy蛋糕店管理系统【程序源码+讲解视频+调试运行】
    【Git】Git 原理和使用
    用python读取各种数据格式(全代码)
    国庆9.30
    概率论的学习整理5:贝叶斯(bayes)法则和贝叶斯概率
    基于JavaWeb的校园故障报修系统(源码+数据脚本+论文+技术文档)
    EM@从整数指数幂到实指数幂
    自定义卡包效果实现
    声明式事务@Transactional
  • 原文地址:https://blog.csdn.net/maizousidemao/article/details/132654835