[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.mzph.cn/web/41166.shtml

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

相关文章

WordPress常见问题及简要说明

1. 如何安装WordPress? 简要说明&#xff1a;WordPress是一个流行的内容管理系统&#xff0c;可以帮助用户快速搭建网站。安装WordPress需要以下几个步骤&#xff1a;下载WordPress安装包、上传到服务器、创建数据库、配置数据库信息、完成安装。 2. 如何创建一个新的WordPr…

掌握电量脉搏:WebKit 电池状态(Battery Status API)支持全解析

掌握电量脉搏&#xff1a;WebKit 电池状态&#xff08;Battery Status API&#xff09;支持全解析 随着移动设备的广泛使用&#xff0c;Web 应用对设备的电池状态信息的需求日益增长。Battery Status API 提供了一种方式&#xff0c;允许 Web 应用访问设备的电池信息&#xff…

【反悔贪心 反悔堆】1642. 可以到达的最远建筑

本文涉及知识点 反悔贪心 反悔堆 LeetCode1642. 可以到达的最远建筑 给你一个整数数组 heights &#xff0c;表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程&#xff0c;不断向后面的建筑物移动&#xff0c;期间可能会用到砖块或梯子。 当…

Spring Boot中的全局异常处理

Spring Boot中的全局异常处理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现全局异常处理&#xff0c;这是保证应用…

VSCode, 请在windows下使用git bash终端

用vscode在windows下调测代码&#xff0c;运行时默认打开的终端是windows的cmd&#xff0c;很不受我待见。毕竟习惯了linux&#xff0c;习惯了windows下的git bash风格。怎么办&#xff1f; search&#xff0c;search&#xff0c;research。 先确保windows上安装了git bash。…

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已经推出了预览版&#xff0c;本期介绍一些MATLAB部分的主要的更新内容。 帮助浏览器被移除 在此前的版本&#xff0c;当我们从MATLAB中访问帮助文档时&#xff0c;默认会通过MATLAB的帮助浏览器&#xff08;Help browser&#xff09;。 2024b版本开始&…

【Unity数据交互】如何Unity中读取Ecxel中的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

医院挂号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;患者管理&#xff0c;医生管理&#xff0c;专家信息管理&#xff0c;科室管理&#xff0c;预约信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;专家信息&#xff0…

数据结构算法-排序(一)-冒泡排序

什么是冒泡排序 冒泡排序&#xff1a;在原数组中通过相邻两项元素的比较&#xff0c;交换而完成的排序算法。 算法核心 数组中相邻两项比较、交换。 算法复杂度 时间复杂度 实现一次排序找到最大值需要遍历 n-1次(n为数组长度) 需要这样的排序 n-1次。 需要 (n-1) * (n-1) —…

Java事务(Transaction)

Java事务&#xff08;Transaction&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列组成&#xff0c;这些操作要么全部执行&#xff0c;要么全部不执行&#xff0c;是一个不可分割的工作单位。事务的引入主要是为了解决并发操作数据…

Unity中遇到“Input Button unload_long_back_btn is not setup”问题

当你在Unity中遇到“Input Button unload_long_back_btn is not setup”这个问题时&#xff0c;需要按照以下步骤进行处理&#xff1a; 1. 检查按钮名称 确保你在代码中使用的按钮名称&#xff08;unload_long_back_btn&#xff09;与Unity输入管理器中的配置完全匹配。 2. …

[AIGC] ClickHouse分布式表与本地表的区别及如何查询所有本地表记录

在大规模数据处理和分析场景中&#xff0c;ClickHouse是一种高性能的列式数据库管理系统。ClickHouse支持分布式表和本地表两种表类型&#xff0c;本文将介绍这两种表类型的区别&#xff0c;并探讨如何建表以查询所有本地表的记录。 文章目录 一、ClickHouse分布式表与本地表的…

【Linux进阶】文件系统7——文件系统简单操作

1.磁盘与目录的容量 现在我们知道磁盘的整体数据是在超级区块中&#xff0c;但是每个文件的容量则在inode 当中记载。 那在命令行模式下面该如何显示这几个数据&#xff1f;下面就让我们来谈一谈这两个命令&#xff1a; df&#xff1a;列出文件系统的整体磁盘使用量&#xf…

Poker Game, Run Fast

Poker Game, Run Fast 扑克&#xff1a;跑得快 分门别类&#xff1a; 单张从小到大默认 A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K 跑得快&#xff1a;单张从小到大 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 &…

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…

大数据处理利器:Apache Spark编程基础与实战

"大数据处理利器&#xff1a;Apache Spark编程基础与实战" 是一个涵盖了Apache Spark这一强大大数据处理框架的深入学习和实践指南。Apache Spark是一个快速、通用、可扩展的大数据处理引擎&#xff0c;它提供了高级别的API用于大规模数据处理和分析。下面&#xff0…

求职成功率的算法,与葫芦娃救爷爷的算法,有哪些相同与不同

1 本节概述 通过在B站百刷葫芦娃这部儿时剧&#xff0c;我觉得可以从中梳理出一些算法&#xff0c;甚至可以用于求职这个场景。所以&#xff0c;大家可以随便问我葫芦娃的一些剧情和感悟&#xff0c;我都可以做一些回答。 2 葫芦娃救爷爷有哪些算法可言&#xff1f; 我们知道…

身体(body)的觉醒

佛&#xff0c;是一个梵文的汉语音译词&#xff0c;指觉醒者。 何谓觉醒&#xff1f;什么的觉醒&#xff1f;其实很简单&#xff0c;就是身体的觉醒。 佛的另一个名字&#xff0c;叫菩提&#xff0c;佛就是菩提&#xff0c;菩提老祖&#xff0c;就是佛祖。 body&#xff0c;即…

微服务: 初识 Spring Cloud

什么是微服务? 微服务就像把一个大公司拆成很多小部门&#xff0c;每个部门各自负责一块业务。这样一来&#xff0c;每个部门都可以独立工作&#xff0c;即使一个部门出了问题&#xff0c;也不会影响整个公司运作。 什么是Spring Cloud? Spring Cloud 是一套工具包&#x…

Oracle RAC 19c 打补丁至最新版本-19.23.0.0.0

实验环境-我是从19.0.0.0直接打到19.23.0.0.0&#xff0c;适合刚部署好的集群打补丁直接到最新版本。 查看当前环境 查询集群中运行的 Oracle Clusterware 软件的 activex 版 查询本地节点上二进制文件中存储的 Oracle Clusterware 软件的版本 查询本地服务器上 OHAS 和 Oracle…