[C++][CMake][流程控制]详细讲解
目录
- 1.条件判断
- 1.基本表达式
- 2.逻辑判断
- 3.比较
- 4.文件操作
- 5.其他
- 2.循环
- 1.foreach
- 2.while
1.条件判断
- 在进行条件判断的时候,如果有多个条件,那么可以写多个elseif,最后一个条件可以使用else,但是开始和结束是必须要成对出现的,分别为:if和endif
- 语法:
if() elseif() # 可选快, 可以重复 else() # 可选快 endif()
1.基本表达式
- 语法:
if()
- 如果是基本表达式,expression有以下三种情况:常量、变量、字符串
- 如果是1, ON, YES, TRUE, Y, 非零值,非空字符串时,条件判断返回True
- 如果是0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串时,条件判断返回False
2.逻辑判断
- NOT:逻辑取反
if(NOT )
- AND:逻辑与
if( AND )
- OR:逻辑或
if( OR )
3.比较
- 基于数值的比较
if( LESS ) if( GREATER ) if( EQUAL ) if( LESS_EQUAL ) if( GREATER_EQUAL )
- 基于字符串的比较
if( STRLESS ) if( STRGREATER ) if( STREQUAL ) if( STRLESS_EQUAL ) if( STRGREATER_EQUAL )
4.文件操作
- 判断文件或者目录是否存在
if(EXISTS path-to-file-or-directory)
- 判断是不是目录:此处path必须是绝对路径
if(IS_DIRECTORY path)
- 判断是不是软链接:此处的file-name必须是绝对路径
if(IS_SYMLINK file-name)
- 判断是不是绝对路径
if(IS_ABSOLUTE path)
5.其他
- 判断某个元素是否在列表中:CMake版本要求 > 3.3
if( IN_LIST )
- 比较两个路径是否相等:CMake版本要求 > 3.24
if( PATH_EQUAL )
- 关于路径的比较其实就是两个字符串的比较,如果路径格式书写没有问题也可以通过下面这种方式进行比较
if( STREQUAL )
- 在书写某个路径的时候,可能由于误操作会多写几个分隔符,比如把/a/b/c写成/a//b///c,此时通过STREQUAL对这两个字符串进行比较肯定是不相等的,但是通过PATH_EQUAL去比较两个路径,得到的结果确实相等的,可以看下面的例子:
cmake_minimum_required(VERSION 3.26) project(test) if("/home//robin///Linux" PATH_EQUAL "/home/robin/Linux") message("路径相等") # √ else() message("路径不相等") endif() message(STATUS "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") if("/home//robin///Linux" STREQUAL "/home/robin/Linux") message("路径相等") else() message("路径不相等") # √ endif() - 结论:在进行路径比较的时候
- 如果使用PATH_EQUAL可以自动剔除路径中多余的分割线然后再进行路径的对比
- 使用STREQUAL则只能进行字符串比较
2.循环
1.foreach
- 通过foreach就可以对items中的数据进行遍历,然后通过loop_var将遍历到的当前的值取出
- 语法:
foreach( ) endforeach() - loop_var在取值的时候有以下几种用法:
- foreach( RANGE )
- 参数:
- RANGE:关键字,表示要遍历范围
- stop:这是一个正整数,表示范围的结束值,[0, stop]
- loop_var:存储每次循环取出的值
- 示例:
cmake_minimum_required(VERSION 3.2) project(test) foreach(item RANGE 10) message(STATUS "当前遍历的值为: ${item}" ) endforeach() - foreach( RANGE [])
- 在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长
- 参数:
- RANGE:关键字,表示要遍历范围
- start:这是一个正整数,表示范围的起始值,也就是说最小值为start
- stop:这是一个正整数,表示范围的结束值,也就是说最大值为stop
- step:控制每次遍历的时候以怎样的步长增长,默认为1,可以不设置
- loop_var:存储每次循环取出的值
- 示例:
cmake_minimum_required(VERSION 3.2) project(test) foreach(item RANGE 10 30 2) message(STATUS "当前遍历的值为: ${item}" ) endforeach() - foreach( IN [LISTS []] [ITEMS []])
- 这是foreach的另一个变体,通过这种方式可以对更加复杂的数据进行遍历,前两种方式只适用于对某个正整数范围内的遍历
- 参数:
- IN:关键字,表示在xxx里面
- LISTS:关键字,对应的是列表list,通过set、list可以获得
- ITEMS:关键字,对应的也是列表
- loop_var:存储每次循环取出的值
- 示例1:
cmake_minimum_required(VERSION 3.2) project(test) # 创建 list set(WORD a b c d) set(NAME I am DieSnowK) # 遍历 list foreach(item IN LISTS WORD NAME) message(STATUS "当前遍历的值为: ${item}" ) endforeach() - 结果1
-- 当前遍历的值为: a -- 当前遍历的值为: b -- 当前遍历的值为: c -- 当前遍历的值为: d -- 当前遍历的值为: I -- 当前遍历的值为: am -- 当前遍历的值为: DieSnowK
- 示例2
cmake_minimum_required(VERSION 3.2) project(test) set(WORD a b c "d e f") set(NAME I am DieSnowK) foreach(item IN ITEMS ${WORD} ${NAME}) message(STATUS "当前遍历的值为: ${item}" ) endforeach() - 结果2
-- 当前遍历的值为: a -- 当前遍历的值为: b -- 当前遍历的值为: c -- 当前遍历的值为: d e f -- 当前遍历的值为: I -- 当前遍历的值为: am -- 当前遍历的值为: DieSnowK
- 两种示例的区别:
- 遍历过程中将关键字LISTS改成了ITEMS,后边跟的还是一个或者多个列表
- 只不过此时需要通过${}将列表中的值取出
- foreach(... IN ZIP_LISTS )
- 注意:CMake版本要求 > 3.17
- 通过这种方式,遍历的还是一个或多个列表,可以理解为是方式3的加强版
- 因为通过上面的方式遍历多个列表,但是又想把指定列表中的元素取出来使用是做不到的,在这个加强版中就可以轻松实现
- 参数:
- IN:关键字,表示在xxx里面
- ZIP_LISTS:关键字,对应的是列表list,通过set、list可以获得
- loop_var:存储每次循环取出的值,可以根据要遍历的列表的数量指定多个变量,用于存储对应的列表当前取出的那个值
- 如果指定了多个变量名,它们的数量应该和列表的数量相等
- 如果只给出了一个loop_var,那么它将一系列的loop_var_N变量来存储对应列表中的当前项
- loop_var_0对应第一个列表
- loop_var_1对应第二个列表
- 以此类推…
- 示例:
cmake_minimum_required(VERSION 3.17) project(test) # 通过list给列表添加数据 list(APPEND WORD Die SnowK "Die SnowK") list(APPEND NAME I am Die SnowK haha) # 遍历列表 foreach(item1 item2 IN ZIP_LISTS WORD NAME) message(STATUS "当前遍历的值为: item1 = ${item1}, item2=${item2}" ) endforeach() message("=============================") # 遍历列表 foreach(item IN ZIP_LISTS WORD NAME) message(STATUS "当前遍历的值为: item1 = ${item_0}, item2=${item_1}" ) endforeach() - 结果
-- 当前遍历的值为: item1 = Die, item2=I -- 当前遍历的值为: item1 = SnowK, item2=am -- 当前遍历的值为: item1 = Die SnowK, item2=Die -- 当前遍历的值为: item1 = , item2=SnowK -- 当前遍历的值为: item1 = , item2=haha ============================= -- 当前遍历的值为: item1 = Die, item2=I -- 当前遍历的值为: item1 = SnowK, item2=am -- 当前遍历的值为: item1 = Die SnowK, item2=Die -- 当前遍历的值为: item1 = , item2=SnowK -- 当前遍历的值为: item1 = , item2=haha
2.while
- 语法:循环结束对应的条件判断的书写格式和if/elseif是一样的
while() endwhile() - 示例:
cmake_minimum_required(VERSION 3.5) project(test) # 创建一个列表 NAME set(NAME I am Die SnowK haha) # 得到列表长度 list(LENGTH NAME LEN) # 循环 while(${LEN} GREATER 0) message(STATUS "names = ${NAME}") # 弹出列表头部元素 list(POP_FRONT NAME) # 更新列表长度 list(LENGTH NAME LEN) endwhile() - 结果
-- names = I;am;Die;SnowK;haha -- names = am;Die;SnowK;haha -- names = Die;SnowK;haha -- names = SnowK;haha -- names = haha
(图片来源网络,侵删) - 语法:循环结束对应的条件判断的书写格式和if/elseif是一样的
- 参数:
- foreach( RANGE )
- 关于路径的比较其实就是两个字符串的比较,如果路径格式书写没有问题也可以通过下面这种方式进行比较
- 判断某个元素是否在列表中:CMake版本要求 > 3.3
- 判断文件或者目录是否存在
- 基于数值的比较
- NOT:逻辑取反
- 语法:
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
