cmake流程控制--循环

news2024/11/18 17:39:01

目录

for循环

普通方式

demo

cmake3.17中添加了一种特殊的形式,可以在一次循环多个列表,其形式如下:

demo

 类似python语言的for循环

demo

while循环

demo

cmake跳出循环(break)和继续下次循环(continue) 

demo

block()和endblock()命令定义的块内也是允许break()和continue()命令的


for循环

普通方式


 foreach(loopVar arg1 arg2 ...)
   <commands>
 endforeach()


 foreach(loopVar IN [LISTS listVar1 ...] [ITEMS item1 ...])
   <commands>
 endforeach()

第一种形式很简单,每一次循环,loopVar都将从arg1 arg2 ...中取出一个值,然后在循环体中使用.

第二种形式比较通用,但是只有有IN关键字,那后面的[LISTS listVar1 ...] [ITEMS item1 ...]就必须有其中一个或者都有,当两者都有的时候,[ITEMS item1 ...]需要全部放到[LISTS listVar1 ...]后面.

还有一点需要注意的是,[ITEMS item1 ...]中的item1 ..都不会最为变量使用,就仅仅是字符串或者值.

demo

第二个循环 IN LISTS ITEMS是关键字 IN是必须的,LISTS关键字后面的列表是按照list里面的值打印出来的,ITEMS关键字后面的如果没有${}修饰会把他们当成值,是什么就打印什么比如bar就直接打印出来了,如果有${}修饰会把他当成变量来打印里面的值.

message("-------------------------------")
set(list1 A B)
set(list2)
set(foo willNotBeShown)

foreach(num 1 2 3 4 5 6)
        message(STATUS "num = ${num}")
endforeach()


foreach(loopVar IN LISTS list1 list2 ITEMS ${foo} bar)
        message(STATUS "Iteration for: ${loopVar}")
endforeach()
message("-------------------------------")

cmake3.17中添加了一种特殊的形式,可以在一次循环多个列表,其形式如下:

foreach(loopVar ... IN ZIP_LISTS listVar ...)
    #...
#endforeach

如果只给出一个loopVar,则该命令将在每次迭代时设置loopVar_N形式的变量,N对应的是listVarN变量,编号从0开始.如果每一listVar都有一个loopVar,那么该命令会一对一映射他们,而不是创建loopVar_N 变量.

以这种方式"压缩"的列表长度不必相同.当迭代超过较短的列表时,取未定义变量的值会导致空字符.

demo

message("-------------------------------")

message("设置一个loopVar")
set(list1 A B)
set(list2 1 2 3 4 5)
foreach(var IN ZIP_LISTS list1 list2)
        message(STATUS "vars = ${var_0} : ${var_1}")
endforeach()
message("设置两个loopVar")
foreach(var0 var1 IN ZIP_LISTS list1 list2)
        message(STATUS "var0 = ${var0} : var1 = ${var1}")
endforeach()

 类似python语言的for循环

第一种形式在start到stop之间迭代,可以指定步长[step],第二种形式等价于:

foreach(loopVar RANGE 0 value).为了清晰,我们应该避免第二种形式,只使用第一种形式.

foreach(loopVar RANGE start stop [step])

endforeach()

foreach(loopVar RANGE value)

endforeach()

demo

message("-------------------------------")
message("不添加步长")
foreach(num RANGE 0 6)
        message(STATUS "num = ${num}")
endforeach()

message("添加步长")
foreach(num RANGE 0 6 2)
        message(STATUS "num = ${num}")
endforeach()
message("第二种形式")
foreach(loopVar RANGE 6)
        message(STATUS "loopVar = ${loopVar}")
endforeach()

 

while循环

cmake也支持while循环,当一个条件表达式为真的时候while循环将执行其中的语句,然后再次验证条件表达式是否为假,否则将重复执行while循环体中的命令.cmake while循环格式如下:

while(condition)
    # ...
endwhile()

condition的判断规则如同if()命令.

demo

message("-------------------------------")
set(num 4)

while(num GREATER 0)
         message(STATUS "num = ${num}")
         math(EXPR num "${num} - 1")
endwhile()

cmake跳出循环(break)和继续下次循环(continue) 

while循环和for循环都支持提前退出循环,使用break()命令实现,也支持跳出当前循环,进入下一次循环,使用continue()命令实现.这两个命令和C++中关键字行为是相同的.

demo

注意一点:

                string(LENGTH "${s}" length)
                message("s length = ${length}  s = ${s}")

 求length的长度,s是一个列表求长度会算分号的长度,例如a1;a2这个是s的list,他的长度是5因为分号长度也为1.

message("-------------------------------")
foreach(outerVar IN ITEMS a b c)
        unset(s)
        foreach(innerVar IN ITEMS 1 2 3)
                list(APPEND s "${outerVar}${innerVar}")
                string(LENGTH "${s}" length)
                message("s length = ${length}  s = ${s}")
                if(length GREATER 5)
                        break()
                endif()
                if(outerVar STREQUAL "b")
                        continue()
                endif()
                message("Processing ${outerVar}-${innerVar}")
        endforeach()
        message("Accumulated list: ${s}")
endforeach()

 

block()和endblock()命令定义的块内也是允许break()和continue()命令的

PROPAGATE 抛出在block里操作的对外面有效果

list(POP_FRONT values next)从前抛出到next

if(next MATCHES "skip")正则表达式,是否存在"skip"

message("-------------------------------")
set(log "Value: ")
set(values one two skipMe three stopHere four)
set(didSkip FALSE)
while(NOT values STREQUAL "")
        list(POP_FRONT values next)
        block(PROPAGATE didSkip)
                string(APPEND log "${next}")
                if(next MATCHES "skip")
                        set(didSkip TRUE)
                        continue()
                elseif(next MATCHES "stop")
                        break()
                elseif(next MATCHES "t")
                        string(APPEND log ", has t")
                endif()
                message("${log}")
        endblock()
endwhile()
message("Did skip: ${didSkip}")
message("Remaining values: ${values}")

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下 Hexdump查看hex文件

链接 &#xff1a; https://www.di-mgt.com.au/hexdump-for-windows.html C:\hexdump-2.0.2 下载解压&#xff0c;以管理员权限拷贝至C:\Windows 便可使用查看命令

蓝牙定位系统|蓝牙网关定位和蓝牙Beacon定位的区别有哪些?

作为室外定位向室内环境的延伸&#xff0c;为了解决室外定位导航“最后一公里”的问题&#xff0c;室内定位领域的科技公司和研究机构也做出了很多的努力。目前市场主流的是基于蓝牙网关、蓝牙Beacon的室内定位方案&#xff0c;经常会有客户问到&#xff0c;这两种方案有什么区…

STL好难(7):优先级队列(priority_queue)与仿函数

目录 1.优先级队列的介绍&#xff1a; 2.priority_queue的函数接口 3.仿函数&#xff08;函数对象&#xff09;的简单理解 4.priority_queue的模拟实现&#xff1a; 1.优先级队列的介绍&#xff1a; 点击查看priority_queue的文档介绍 1. 优先队列是一种容器适配器&#x…

默认成员函数

前文提要 本文全文以日期类为例 先简单写一个日期类 class Data{ public:private:int _year;int _month;int _day; };且补充一个小知识 数据类型的划分 内置类型&#xff1a;是编程语言提供的基本数据类型&#xff0c;例如整数、浮点数、字符、布尔值 自定义类型&#xff1…

FreeRTOS实时操作系统(十二)事件标志组

系列文章目录 文章目录 系列文章目录事件标志组事件标志组API函数实验测试 事件标志组 事件标志位&#xff1a;用一个位来表示事件是否可以发生。 事件标志组是一组事件标志位的集合 特点&#xff1a; 1.每一个位表示一个事件&#xff08;高8位不是&#xff09; 2.每一位事件…

Java的异常Exception

异常 1、异常概述与异常体系结构 1.1、异常概述 异常&#xff1a;在Java语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; Java程序在执行过程中所发生的异常事件可分为两类&#xff1a; Erro…

装饰器模式:通过剖析Java IO类库源码学习装饰器模式

我们通过剖析Java IO类的设计思想&#xff0c;再学习一种新的结构型模式&#xff0c;装饰器模式。它的代码结构跟桥接模式非常相似&#xff0c;不过&#xff0c;要解决的问题却大不相同。 Java IO类库非常庞大和复杂&#xff0c;有几十个类&#xff0c;负责IO数据的读取…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一&#xff1a;通过程序路径指定应用程序&#xff0c;例如指定写字板程序路径。1.2示例二&#xff1a;通过程序ID指定应用程序&#xff0c;例如指定计算器ID。1.3 应用程序ID&#xff0…

芯片工程师求职题目之验证篇(2)

1. 事件驱动的仿真器和和基于周期的仿真器有什么区别&#xff1f; 事件驱动的仿真器顾名思义就是根据事件(event)触发仿真进行的&#xff0c;在进入一个周期中&#xff0c;它会获取每个事件并通过设计传播求值&#xff0c;直到达到稳定状态的条件&#xff0c;接着进入下一个周…

Android:安卓开发采用Volley网络框架+MySQL数据库,实现从服务器获取数据并展示完成记单词APP

一、功能与要求 实现功能&#xff1a;设计一个记单词APP。服务器采用Tomcat&#xff0c;数据库采用Mysql。实现用户的注册登录功能以及单词的增删改查。 指标要求&#xff1a;实现UI布局&#xff1b;将系统数据保存到Mysql数据库中&#xff0c;并采用Volley网络框架实现从服务…

【机器学习核心总结】什么是随机森林

什么是随机森林 森林里有很多树&#xff0c;随机森林里有很多决策树。 随机森林是决策树的升级版&#xff0c;随机指的是树的生长过程。世上没有两片相同的树叶&#xff0c;随机森林中的树也各不相同。在构建决策树时&#xff0c;我们会从训练数据中有放回的随机选取一部分样本…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面&#xff0c;让用户可以访问 负载均衡策略&#xff1a; Service 的类型&#xff1a; 案例&#xff1a;Service服务发布案例 扩展&#xff1a;我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件&#xff1a; 创建Pod&…

ChatGLM2-6B发布,C-Eval超GPT4,支持32k上下文!

自清华大学数据挖掘实验室&#xff08;THUDM&#xff09;3月开源ChatGLM-6B已经过去了3个多月&#xff0c;最近他们又带来了性能全面提升的“船新”版本-ChatGLM2-6B。别看名字变化小&#xff0c;其实更新的模型性能是又有量又实用。不了解ChatGLM的小伙伴可以看我这篇文章&…

Java基础之五 反射

通过Java反射机制&#xff0c;可以在程序中访问已经装载到JVM中的Java对象的描述&#xff0c;实现访问、检测和修改描述Java对象本身信息的功能。 通过反射可以访问的主要描述信息 访问成员变量 常用方法&#xff1a;getFields()、getField(String name)、getDeclaredFields()…

第 353 场LeetCode周赛

A 找出最大的可达成数字 签到题 class Solution { public:int theMaximumAchievableX(int num, int t) {return numt*2;} };B 达到末尾下标所需的最大跳跃次数 动态规划: 定义 p i p_i pi​为跳至 i i i处所需的最大跳跃次数, 有状态转移方程 p i m a x { p j 1 ∣ 0 ≤ j &…

文档管理:PaperPort Professional 14.7 Crack

文档管理变得简单 PaperPort Professional 快速、轻松地访问重要文档对于保持组织平稳运行至关重要。与其浪费时间在文件夹中搜索所需的文件&#xff0c;不如在PC上扫描&#xff0c;转换&#xff0c;组织&#xff0c;组装和共享文档和图像&#xff0c;或者更好的是&#xff0c;…

vue对于数组的数据监听变化和object是不一样的吗?

我们知道vue对于数组的数据监听变化和object是不一样的&#xff0c;因为我们常说的Object.defineProperty是对象上面的方法&#xff0c;所以对于array数组需要实现另外一套变化侦测机制。 今天我们就来研究下。 在哪里收集依赖 array数据设计了新的变化侦测机制&#xff0c;…

阿里云服务器架构X86计算、ARM、GPU/FPGA、裸金属和超级计算集群

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

第八章:L2JMobius学习 – 游戏服务GameServer讲解

本章节我们来讲解GameServer服务&#xff0c;首先来查看它的文件结构 ai&#xff1a;游戏角色自动化处理&#xff0c;比如说&#xff0c;自动攻击。 cache&#xff1a;数据缓存&#xff0c;里面就一个HtmCache.java类&#xff0c;缓存HTML文件内容。 communitybbs&#xff1a;b…