cmake流程控制--循环

目录

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.hqwc.cn/news/14335.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL CDC技术方案梳理

本篇主要探讨MySQL数据同步的各类常见技术方案及优劣势对比分析&#xff0c;从而更加深层次的理解方案&#xff0c;进而在后续的实际业务中&#xff0c;更好的选择方案。 1 CDC概念 CDC即Change Data Capture&#xff0c;变更数据捕获&#xff0c;即当数据发生变更时&#xff…

反诈防骗网络安全知识竞赛导出排行榜数据到excel遇到的问题复盘

在昨天的反诈防骗网络安全知识竞赛活动结束后&#xff0c;应主办方要求&#xff0c;我就帮忙导出排行榜全部数据&#xff08;含排名、编号、赛区、成绩、答题用时、答题日期等信息&#xff09;。 导出excel后&#xff0c;打开查看&#xff0c;发现有好几条数据的答题日期并不是…

ubuntu系统自带的Text Editor编辑器不高亮解决办法

平时在写launch文件时&#xff0c;我喜欢用ubuntu系统自带的text编辑器&#xff0c;但发现使用text打开launch 文件时&#xff0c;没有高亮功能了&#xff0c;如下图所示&#xff1a; 解决办法非常简单&#xff0c;因为launch和xml文件语法规则类似&#xff0c;只需将text编辑…

VSCode 免安装及中文设置

前言&#xff1a;VSCode作为目前最强大的文本编辑器&#xff0c;通过内部的插件市场可满足各种开发需求。使用免安装版可以自定义插件安装位置等&#xff0c;而使用安装包安装只能通过修改快捷方式自定义&#xff0c;十分不方便。因此这里分享如何安装免安装版的VSCode。 下载…

【Leetcode】707. 设计链表

单向链表 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self):self.dummy_head ListNode()self.size 0def get(self, index):if index < 0 or index > self.size:return -1current self.dummy_h…

传统图像处理之目标检测——人脸识别

代码实战&#xff1a;人脸识别 import numpy as np import cv2 img cv2.imread("3.webp")face_cascade cv2.CascadeClassifier(r./haarcascade_frontalface_default.xml)gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#探测图片中的人脸 faces face_cascade.detec…

B066-基础环境-前后端整合 批量删除 下拉 级联 增改

目录 批量删除页面调整普通属性的新增和修改引用属性的新增和修改管理员下拉列表部门树 见文档与代码 cd 子项目 运行前端项目 页面布局分析 批量删除 点击多选 - 改变data - 点击批量删除 - 带参数发请求 页面调整 略 普通属性的新增和修改 新增按钮&#xff1a;点击…

UNIAPP调用讯飞语音评测API

1、历经千辛万苦&#xff0c;UNIAPP调用评测API终于完成&#xff0c;在此做下总结下&#xff1a;首先看效果&#xff01; 2、实现第1步&#xff0c;首先是鉴权&#xff0c;用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

使用promise函数封装post请求,封装aes加解密方法,并进行请求头aes加密,封装sm2国密加解密,进行请求体数据加密,响应数据解密。

export default {async post(url, params { header:{}, data:{} }, showLoading true){if(showLoading){uni.showLoading({title:"加载中",mask:true})}let options{header:{...params.header},url:globalParams.basepathurl.url,data:{...params.data}}//渠道 ae…

拆特-机披涕的经典用法

背景 当今的ChatGPT是一款卓越的语言模型&#xff0c;能够助您打造出卓越的产品&#xff0c;并提升业务成功率。利用广泛的自然语言处理和机器学习算法&#xff0c;ChatGPT能够进行流畅自然的对话&#xff0c;理解自然语言问题并给出回答。借助ChatGPT&#xff0c;您可以构建智…

电子电气架构相关安全体系介绍

摘要&#xff1a; 随着电子电气架构技术的不断升级&#xff0c;整车越来越多的系统和组件对功能安全产生影响&#xff0c;为此&#xff0c;功能安全也从部分关键系统开发&#xff0c;向整车各系统全面开发拓展。同时&#xff0c;由于域集中式、中央集中式等新架构形态的出现&a…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…