[C++][CMake][流程控制]详细讲解

目录

  • 1.条件判断
    • 1.基本表达式
    • 2.逻辑判断
    • 3.比较
    • 4.文件操作
    • 5.其他
  • 2.循环
    • 1.foreach
    • 2.while


1.条件判断

  • 在进行条件判断的时候,如果有多个条件,那么可以写多个elseif,最后一个条件可以使用else,但是开始和结束是必须要成对出现的,分别为:ifendif
  • 语法
    if(<condition>)
      <commands>
    elseif(<condition>) # 可选快, 可以重复
      <commands>
    else()              # 可选快
      <commands>
    endif()
    

1.基本表达式

  • 语法
    if(<expression>)
    
  • 如果是基本表达式,expression有以下三种情况:常量、变量、字符串
    • 如果是1, ON, YES, TRUE, Y, 非零值非空字符串时,条件判断返回True
    • 如果是0, OFF, NO, FALSE, N, IGNORE, NOTFOUND空字符串时,条件判断返回False

2.逻辑判断

  • NOT:逻辑取反
    if(NOT <condition>)
    
  • AND:逻辑与
    if(<cond1> AND <cond2>)
    
  • OR:逻辑或
    if(<cond1> OR <cond2>)
    

3.比较

  • 基于数值的比较
    if(<variable|string> LESS <variable|string>)
    if(<variable|string> GREATER <variable|string>)
    if(<variable|string> EQUAL <variable|string>)
    if(<variable|string> LESS_EQUAL <variable|string>)
    if(<variable|string> GREATER_EQUAL <variable|string>)
    
  • 基于字符串的比较
    if(<variable|string> STRLESS <variable|string>)
    if(<variable|string> STRGREATER <variable|string>)
    if(<variable|string> STREQUAL <variable|string>)
    if(<variable|string> STRLESS_EQUAL <variable|string>)
    if(<variable|string> STRGREATER_EQUAL <variable|string>)
    

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(<variable|string> IN_LIST <variable>)
    
  • 比较两个路径是否相等CMake版本要求 > 3.24
    if(<variable|string> PATH_EQUAL <variable|string>)
    
    • 关于路径的比较其实就是两个字符串的比较,如果路径格式书写没有问题也可以通过下面这种方式进行比较
      if(<variable|string> STREQUAL <variable|string>)
      
    • 在书写某个路径的时候,可能由于误操作会多写几个分隔符,比如把/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(<loop_var> <items>)
        <commands>
    endforeach()
    
  • loop_var在取值的时候有以下几种用法:
    • foreach(<loop_var> RANGE <stop>)
      • 参数
        • RANGE:关键字,表示要遍历范围
        • stop:这是一个正整数,表示范围的结束值[0, stop]
        • loop_var:存储每次循环取出的值
      • 示例
        cmake_minimum_required(VERSION 3.2)
        project(test)
        
        foreach(item RANGE 10)
            message(STATUS "当前遍历的值为: ${item}" )
        endforeach()
        
    • foreach(<loop_var> RANGE <start> <stop> [<step>])
      • 在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长
      • 参数
        • 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(<loop_var> IN [LISTS [<lists>]] [ITEMS [<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(<loop_var>... IN ZIP_LISTS <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(<condition>)
        <commands>
    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
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据自动备份方法分享!

现在很多朋友对于第三方软件颇为青睐&#xff0c;因为它们具备许多电脑自带备份工具所不具备的功能。例如&#xff0c;自动备份数据的需求。尽管你已经备份了电脑数据&#xff0c;但日常使用中数据常会增加&#xff0c;你可能无暇顾及每天的备份工作。因此&#xff0c;使用数据…

alibaba EasyExcel 简单导出数据到Excel

导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.1</version> </dependency> 1、alibaba.excel.EasyExcel导出工具类 import com.alibaba.excel.EasyExcel; import …

c++ primer plus 第15章友,异常和其他: 15.2.1 嵌套类和访问权限系

c primer plus 第15章友&#xff0c;异常和其他&#xff1a; 15.2.1 嵌套类和访问权限系 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;c primer plus 第15章友&#xff0c;异常和其他&#xff1a; 15.2.1 嵌套类和…

Kubernetes分享

幂等性(Idempotency) 介绍 简单来说&#xff0c;幂等性幂等性(Idempotency)是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络应用中。指的是某个操作可以重复执行多次&#xff0c;但其结果是相同的&#xff0c;不会因为多次执行而改变系统的状态。 https://…

rkmpp移植与测试

一、mpp交叉编译 MPP(Media Process Platform )是Rockchip提供的一款硬件编解码媒体处理软件平台&#xff0c;适用于Rockchip芯片系列。它屏蔽了有关芯片的复杂底层处理&#xff0c;屏蔽了不同芯片的差异&#xff0c;为使用者提供了一组MPI统一接口。如果想达到最好的效果&…

打造属于自己的脚手架工具并发布到npm仓库

一、创建项目 使用 npm init -y 创建项目创建项目入口文件 index.js在 package.json 中添加 bin 字段使用 npm link 命令将文件映射至全局&#xff0c;使可以在本地测试 zp 命令 // "zp" 为用于全局执行脚手架的命令&#xff0c;vue-cli中使用的是vue命令 "bi…

QT滑块图片验证程序

使用QT实现滑块验证程序&#xff0c;原理是画个图片&#xff0c;然后在图片上画个空白区域&#xff0c;再画个滑块图片。 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widg…

物联网的技术和应用有哪些?

随着科技的飞速发展&#xff0c;物联网已经成为连接世界的重要纽带&#xff0c;塑造着我们未来的生活。我们一起深入探索物联网的前沿技术和前瞻性应用&#xff0c;一窥未来的可能性。 获取物联网解决方案&#xff0c;YesPMP平台一站式物联网开发服务。 提示&#xff1a;智慧家…

Google Earth Engine(GEE)——ui.Panel添加到地图上

结果 函数 ui.root.add(widget) 将一个widget添加到根面板上。 返回根面板。 参数。 widget&#xff08;ui.Widget&#xff09;。 要添加的widget。 返回&#xff1a; ui.Panel 代码 //label var label ui.Label({ value: "text label", style: {fontSi…

java 公共字段填充

公共字段填充 1、mybatis-plus2、mybatis 使用注解加aop2.1 自定义注解2.2 自定义切面类2.3 在mapper上添加上自定义的注解 1、mybatis-plus 通过在类上使用如下的注解 TableField(fill FieldFill.INSERT) 是 MyBatis-Plus 中的注解&#xff0c;用于自动填充字段的值。MyBat…

上海外贸建站公司wordpress模板推荐

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板&#xff0c;适用于外贸公司建独立站…

【HBZ】高性能zeroCopy零拷贝与普通IO差距与原理

简介 随着IO不断地发展&#xff0c;无论哪种拷贝方式&#xff0c;DMA从磁盘拷贝数据到内核缓冲区&#xff0c;都会拷贝多一些数据, 不会只拷贝用户态的指定size的数据&#xff0c;而是会将目标数据的临近数据也都拷贝到内核缓冲区&#xff0c;以便下次IO操作可以直接从内核缓冲…

【Android】自定义换肤框架05之Skinner框架集成

引入依赖 api("io.github.hellogoogle2000:android-skinner:1.0.0")初始化Skinner 在所有功能前调用即可&#xff0c;建议在Application中初始化 SkinnerKit.init(application)安装皮肤包 在应用该皮肤包前安装即可&#xff0c;建议预安装&#xff0c;或应用皮肤…

解决后端限制导致前端配置跨域仍请求失败报504的问题

文章目录 问题一、通过配置跨域方式二、直接真实接口请求三、解决方式四、后端这样做的原因 总结 问题 前端项目设置跨域proxy处理&#xff0c;接口请求不会报跨域&#xff0c;但是接口请求报了504&#xff0c;这种情况如何处理呢&#xff0c;后端又为何要这么做&#xff0c;下…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境&#xff0c;可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o&#xff0c;大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

前端初学java二(类、多态、接口、内部类、泛型)

目录 类 种类 Javabean类 测试类 工具类 类的初始化 构照函数 新建对象的内存图 static 继承 This Super 虚方法表 Override 修饰符权限 构造代码块 静态代码块 多态 前提 优点 缺点 示例 抽象方法 抽象类 接口 implements 继承 内部类 成员内部类…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 机器学习基础与广告营销的结合&#x1f9e9;机器学习在广告营销中的核心应用领域&#x1f339;用…

cf 7.7

Problem - C - Codeforces 大致意思&#xff1a; 找前缀&#xff0c;排序后使得本位之前数字和等于该位 &#xff08;以下代码超时了&#xff09; #include<bits/stdc.h> typedef long long ll;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) const ll …

阿里云存储应用

如何做好权限控制 小浩在梳理门户网站静态资源时&#xff0c;发现有些资源是仅内部员工可访问&#xff0c;有些资源是特定的注册客户可访问&#xff0c;还有些资源是匿名客户也可以访问。针对不同场景、不同用户&#xff0c;小浩该如何规划企业门户网站静态资源的权限控制呢&a…