【CMake】CMake从入门到实战系列(十)——CMake中的条件语句和循环语句

文章目录

  • 前言
  • 一、条件语句
    • 1、if 语句
        • 【1】基本语法
        • 【2】参数含义
        • 【3】示例
  • 二、循环语句
    • 1、foreach 循环
      • foreach 循环之 基本用法
        • 【1】基本语法
        • 【2】参数含义
        • 【3】示例
      • foreach 循环之 RANGE 关键字
        • 【1】基本语法
        • 【2】参数含义
        • 【3】示例
      • foreach 循环之 IN 关键字
        • 【1】基本语法
        • 【2】参数含义
        • 【3】示例
    • 2、while 循环
        • 【1】基本语法
        • 【2】参数含义
        • 【3】示例
    • 3、break() 与 continue()
        • 示例

前言

CMake 提供了条件语句和循环语句等控制结构,用于根据不同条件执行不同的操作或重复执行某些操作。

一、条件语句

1、if 语句

if 语句用于检查条件是否为真,并根据条件的结果执行相应的代码块。

【1】基本语法
if (condition)# 执行代码块
elseif (condition2)# 执行另一个代码块
else ()# 默认情况下执行的代码块
endif ()
【2】参数含义

在这个语法中,condition是一个表达式,如果该表达式为真,则执行第一个代码块。如果第一个条件不满足,而condition2满足,则执行第二个代码块。如果没有条件满足,则执行else块中的代码。

【3】示例

让我们通过一个简单的示例来演示条件语句在CMake中的使用:
【1】目录结构

project
│
├── CMakeLists.txt

【2】编写CMakeLists.txt
根据是否开启调试模式来设置不同的编译选项。

cmake_minimum_required(VERSION 3.10)
project(MyProject)option(DEBUG "Enable Debug Mode" OFF)if (DEBUG)message("Debug mode is ON")
else ()message("Debug mode is OFF")
endif ()

在这个示例中,我们首先定义了一个名为DEBUG的选项,它可以控制是否启用调试模式。然后,在 if 语句中,我们检查DEBUG变量的值,如果为真,则输出调试模式已启用的消息。如果DEBUG为假,则输出调试模式已关闭的消息。

【3】编译
启用调试模式

cd project
mkdir build && cd build
cmake -DDEBUG=ON ..

关闭调试模式

cd project/build # 假设你已经在build目录内
cmake -DDEBUG=OFF ..

结果
在这里插入图片描述
在实际项目中,可以根据需要扩展这种条件语句的逻辑,例如根据不同的操作系统或编译器版本设置不同的编译选项。

二、循环语句

在 CMake 中,循环语句用于在构建过程中重复执行一系列命令或操作。目前,CMake 支持两种主要的循环语句:foreach 和 while。

1、foreach 循环

foreach有五种变体用法。

变体 1foreach(<loop_var> <items>)# 在这里执行针对每个元素的操作
endforeach()变体 2foreach(<loop_var> RANGE <stop>)变体 3foreach(<loop_var> RANGE <start> <stop> [<step>])变体 4foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])变体 5foreach(<loop_var>... IN ZIP_LISTS <lists>)

下面我们一 一分析总结一下。

foreach 循环之 基本用法

foreach 循环用于遍历列表中的每个元素,并对每个元素执行相应的操作。

【1】基本语法
foreach(<loop_var> <items>)# 在这里执行针对每个元素的操作
endforeach()
【2】参数含义

<loop_var> 表示当前正在迭代的元素,在每次迭代时会被赋值为列表中的一个元素。

<items>是由分号或空格分割的项列表(list of items)。<items>中的每个item调用一次。在每次迭代开始时,变量<loop_var>将被设置为当前item的值。<loop_var>的范围仅限于循环范围。

【3】示例

【1】目录结构

project
│
├── CMakeLists.txt

【2】编写CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyProject)set(my_list item1 item2 item3)
foreach(item ${my_list})message("Current item: ${item}")
endforeach()foreach(var 3 4)message("var: ${var}")
endforeach()

【3】编译

cd project
mkdir build && cd build
cmake ..

在这里插入图片描述

foreach 循环之 RANGE 关键字

【1】基本语法

语法 1:

foreach(<loop_var> RANGE <stop>)

语法 2:

foreach(<loop_var> RANGE <start> <stop> [<step>])
【2】参数含义

语法 1 中,循环会从 0 到指定的数字 <stop>,包含 <stop>,<stop>不能为负数,范围为 [0, <stop>]。

语法 2 中,循环从指定的数字 <start>开始到 <stop>结束,步长为 <step>,不过 <step>参数是一个可选参数, 如果不指定,默认 <step>=1;三个参数都不能为负数,而且 <stop> 不能比 <start>小。

【3】示例

步骤同上

cmake_minimum_required(VERSION 3.10)
project(MyProject)foreach(var RANGE 5)message("var = ${var}")
endforeach()foreach(loop_var RANGE 2 10 2)message("value = ${loop_var}")
endforeach()

编译结果
在这里插入图片描述

foreach 循环之 IN 关键字

【1】基本语法

语法 1:

foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

语法 2:

foreach(<loop_var>... IN ZIP_LISTS <lists>)
【2】参数含义

语法 1 中,<lists>是一个空格或分号分割的列表值变量列表。foreach命令遍历每个给定list中的每个item。跟在ITEMS关键字后面的<items>的处理方式与foreach命令的第一个变体一样。LISTS A和ITEMS ${A}的形式是等价的。

语法 2 中,<lists>是一个空格或分号分割的列表值变量列表。foreach命令同时迭代每个list,设置迭代变量如下:
(1).如果只给出了loop_var,那么它将一系列loop_var_N变量设置为相应list中的当前项。
(2).如果传递了多个变量名,则它们的计数(count)应与list变量计数匹配。
(3).如果任何list较短,则不会为当前迭代定义相应的迭代变量。

【3】示例

步骤同上

cmake_minimum_required(VERSION 3.10)
project(MyProject)set(A 0;1)
set(B 2 3)
set(C "4 5")
set(D 6;7 8)
set(E "")
foreach(X IN LISTS A B C D E)message(STATUS "LISTS X=${X}")
endforeach()foreach(X IN ITEMS ${A} ${B} ${C} ${D} ${E})message(STATUS "ITEMS X=${X}")
endforeach()list(APPEND English one two three four)
list(APPEND Bahasa satu dua tiga)
foreach(num IN ZIP_LISTS English Bahasa)message(STATUS "num_0=${num_0}, num_1=${num_1}")
endforeach()foreach(en ba IN ZIP_LISTS English Bahasa)message(STATUS "en=${en}, ba=${ba}")
endforeach()

编译
在这里插入图片描述

2、while 循环

while 循环用于在满足条件的情况下重复执行一系列命令。

【1】基本语法
while(<condition>)# 在这里执行循环体内的操作
endwhile()
【2】参数含义

<condition> 是一个 CMake 表达式,只有<condition>在为真(非空)时,循环体才会执行。在循环体内,可以使用 break() 来提前跳出循环。

【3】示例

步骤同上

cmake_minimum_required(VERSION 3.10)
project(MyProject)set(i 0)
while(i LESS 5)message("Current value of i: ${i}")math(EXPR i "${i} + 1")
endwhile()

编译
在这里插入图片描述

3、break() 与 continue()

与绝大多数编程语言一样,CMake也可以通过 break() 跳出循环,通过 continue() 结束本次循环并继续下次循环。

示例

步骤同上

cmake_minimum_required(VERSION 3.10)
project(MyProject)set(myList 1 2 3 4 5 6 7)
foreach(var IN LISTS myList)math(EXPR expr ${var}%2)if(expr EQUAL 0)continue()endif()if(${var} GREATER 5)break()endif()message("var = ${var}")
endforeach()

编译
在这里插入图片描述
以上示例中代码是完全且没有删减的,可复制直接使用。

OK,今天总结到此。

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

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

相关文章

什么是大语言模型以及如何构建自己的大型语言模型?

一、关于大语言模型 LLM 对于无数的应用程序非常有用&#xff0c;如果我们自己从头开始构建一个&#xff0c;那我们可以了解底层的ML技术&#xff0c;并可以根据特定需求定制LLM&#xff0c;但是对资源的需求巨大。大型语言模型是一种 ML 模型&#xff0c;可以执行各种自然语言…

Quartz - 任务调度

文章目录 关于 QuartzQuartz的体系结构核心概念设计模式 常用API基本使用 关于 Quartz 官网&#xff1a;https://www.quartz-scheduler.orggithub : https://github.com/quartz-scheduler/quartz文档&#xff1a;https://www.quartz-scheduler.org/documentation/ 相关教程/博…

autodesk系列软件打开提示Flexnet License Finder

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展功能&#xff0c;输入flex&#xff0c;点击搜索 选择对应的这个按钮&#xff0c;点击&#xff0c;提示修复成功即可尝试打开软件

深入学习Linux中的“文件系统与日志分析”

目录 1.文件系统的组成 1.1inode和block 1.2inode的内容 1.3inode的号码 ​1.4文件存储小结 ​1.5inode大小 1.6inode的特殊作用 2. 链接文件 3.文件恢复 3.1EXT类型文件恢复 3.2磁盘有空间&#xff0c;但是仍然无法写入新文件 3.3恢复XFS类型的文件 3.3.1xfsdump…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

vue【vuex状态管理】

1&#xff1a;vuex是什么&#xff1a; vuex是一个状态管理工具&#xff0c;状态就是指的数据&#xff0c;可以将数据存放到vuex中以供其他组件使用时进行调用 2&#xff1a;应用场景&#xff1a; ①&#xff1a;像用户登录客户端&#xff0c;这个用户的数据需要在多个组件中…

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

Linux多进程(一)创建进程与进程控制

一、进程状态 进程一共有五种状态分别为&#xff1a;创建态&#xff0c;就绪态&#xff0c;运行态&#xff0c;阻塞态(挂起态)&#xff0c;退出态(终止态)其中创建态和退出态维持的时间是非常短的&#xff0c;稍纵即逝。主要是就绪态, 运行态, 挂起态三者之间的状态切换。 就绪…

ABB机器人IRB4400平衡缸维修小技巧

ABB平衡缸是机器人是一个不可忽视的重要组成部分。ABB机器人平衡缸通常采用高强度材料制造&#xff0c;设计精巧&#xff0c;方便地集成到IRB4400机器人手臂中。此外&#xff0c;平衡缸还具备良好的密封性能&#xff0c;防止气体或液体泄漏&#xff0c;确保其耐用性和稳定性。因…

Mac电脑清理微信聊天记录 Mac电脑微信缓存怎么删

细心网友突然发现微信已经成为占用电脑存储空间最大的软件&#xff0c;其中包括聊天记录、缓存的文件、图片、视频等等&#xff0c;少则几个G&#xff0c;多则十几个G&#xff0c;让原本就不富裕的Mac存储空间更是雪上加霜。mac电脑清理微信聊天记录成为大家迫切解决的问题&…

MySQL文件目录结构:表在文件系统中的表示

以下内容基于Linux系统&#xff0c;MySQL的 /var/lib/mysql/ 目录下的数据文件 &#x1f496; Innodb 引擎 MySQL 5.7 MySQL 8.0 &#x1f31f; 总结 Innodb 是聚簇索引&#xff0c;索引及数据&#xff0c;数据即索引&#xff0c;所以数据和索引是存储在同一个文件中的 MyS…

Java基本语法(基础部分)

Java基本语法 文章目录 Java基本语法前言一、准备工作1.1 计算机软件与硬件1.2 计算机编程语言1.3 Java语言概述&程序分析1.4 Java环境搭建&Java API1.5 Java核心机制JVM 二、变量2.1 关键字&标识符2.2 变量2.3 数据类型(基本数据类型)2.3.1 基本数据类型2.3.2 基本…

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming&#xff0c;面向切面编程)&#xff1a;是一种新的方法论&#xff0c;是对传统 OOP(Object-Oriented Programming&#xff0c;面向对象编程)的补充。 面向对象是纵向继承&#xff0c;面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…

HARDVS: Revisiting Human Activity Recognition with Dynamic Vision Sensors

标题&#xff1a;HARDVS: 用动态视觉传感器重新审视人类行为识别 原文链接&#xff1a;HARDVS: Revisiting Human Activity Recognition with Dynamic Vision Sensors| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/ar…

PHP 爬虫如何配置代理 IP(CURL 函数)

在 PHP中 配置代理IP&#xff0c;可以通过设置 CURL 库的选项来实现&#xff0c;代码如下&#xff1a; 当然你要有代理ip来源&#xff0c;比如我用的这个 代理商 &#xff0c;如果想服务稳定不建议找开源代理池&#xff0c;避免被劫持。 <?php // 初始化cURL会话 $ch cu…

数据分析师必备的8个思维框架

什么是框架性思维&#xff1f;它是由一个个的思维框架积累而来。本文介绍分析常用的几个思维框架。 一些职位描述中会要求分析师有框架性思维&#xff0c;能够被考察的是思维框架&#xff0c;通过思维框架判断框架性思维能力。笔者查阅了多篇文章&#xff0c;定义思维框架为&a…

文件上传漏洞-白名单检测

如何确认是否是白名单检测 上传一张图片与上传一个自己构造的后缀&#xff0c;如果只能上传图片不能上传其它后缀文件&#xff0c;说明是白名单检测。 绕过技巧 可以利用 00 截断的方式进行绕过&#xff0c;包括 %00 截断与 0x00 截断。除此之外如果网站存在文件包含漏洞&…

统一SQL 支持Oracle unpivot列转行

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;可以使用unpivot将列转换成行&#xff0c;在TDSQL-MySQL中没有对应的功能&#xff0c;由…

面试官竟然是个小黑子,问我用过状态机吗

状态机的组成 状态机是一种抽象的数学模型&#xff0c;描述了对象或系统在特定时间点可能处于的各种状态以及状态之间的转换规则。它由一组状态、事件、转移和动作组成&#xff0c;用于模拟对象在不同条件下的行为和状态变化。 状态机包括以下基本组成部分&#xff1a; 状态&…

【IR 论文】Query2doc — 使用 LLM 做 Query Expansion 来提高信息检索能力

论文&#xff1a;Query2doc: Query Expansion with Large Language Models ⭐⭐⭐⭐⭐ Microsoft Research, EMNLP 2023 文章目录 背景介绍Query2doc 论文速读实现细节实验结果和分析总结分析 背景介绍 信息检索&#xff08;Information Retrieval&#xff0c;IR&#xff09;指…