cmake 提前结束处理命令: return

有时候,我们有这样的需求,当处理到某个地方的时候,后面的我们都不想处理或者不需要处理的时候,就可以提前结束当前的处理逻辑,回到父级去处理.在C/C++中,我们有break关键字跳出当前循环,continue关键字进入下一次循环,return关键字返回当前处理的函数.

cmake也提供了break(),continue(),return()命令.

  • 如果调用return()命令的地方不在一个函数中,那将结束当前文件的处理,回到引用当前文件的地方.引入一个cmake脚本文件的方式可以是include()命令,也可以是add_subdirrectory()命令.
  • 在函数中调用return()命令比较复杂,但是很重要.

在cmake 3.25版本之前,return()命令是没有参数的,从cmake3.25开始,return()命令有了类似block()命令的参数关键字:PROPAGATE,在这个关键字后面我们可以列出一些变量,这些变量在调用return()命令的时候会更新其值.

为了兼容旧版本,我们在使用return()命令的时候如果关键字参数:PROPAGATE,那么我们通常需要把CMP0140这个策略设置为NEW.

demo

目录结构顶层文件夹是021,下面有一个subdir文件夹,一个cmake文件,一个cmake脚本文件

顶层cmake文件:

 

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)project(021)set(x 1)
set(y 2)message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")add_subdirectory(subdir)
# include(test_include.cmake)message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

subdir文件夹下的cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")set(x 3)
unset(y)message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")return(PROPAGATE x y)message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

结果: 

 cmake脚本文件cmake内容:

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")set(x 3)
unset(y)message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")return()message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

顶层cmake文件注释add_subdirectory(subdir) 包含include 脚本文件

cmake脚本文件:

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")set(x 3)
unset(y)message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")return()message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

 注意脚本文件大体上和subdir文件夹下的cmake类似不同的是,脚本文件的return()命令是空的.为啥是空的?因为return()命令是需要有父级作用域的,使用include的方式不是父级作用域,所以不用参数.

如果return()命令有值cmake会出错的.

结果是一样的

 

block()命令结合return()命令

修改顶层cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)project(021)set(x 1)
set(y 2)message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")block()add_subdirectory(subdir)message(STATUS "block after: x = [${x}]")message(STATUS "block after: y = [${y}]")endblock()# include(test_include.cmake)message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

结果:

 

 在subdir文件下下使用block

顶层cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)project(021)set(x 1)
set(y 2)message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")# block()#     add_subdirectory(subdir)
#     message(STATUS "block after: x = [${x}]")
#     message(STATUS "block after: y = [${y}]")# endblock()
add_subdirectory(subdir)# include(test_include.cmake)message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

subdir cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")block()set(x 3)unset(y)message(STATUS "sub after: x = [${x}]")message(STATUS "sub after: y = [${y}]")return(PROPAGATE x y)
endblock()message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

结果:

CMake另外一种类似与C/C++头文件防御的方式,在引入新的Cmake脚本文件的时候提前返回.

cmake各个版本通用的方式是这样的:

if (DEFINED cool_stuff_include_guard)return()
endif()set(cool_stuff_include_guard 1)
# ...

 cmake 3.10开始,我们可以使用一条命令代替: include_guard()

include_guard()命令支持两个关键字,GLOBAL和DIRECTORY.一般情况下不需要.

  • GLOBAL 关键字表示在全局范围内如果曾经处理过这个文件,那就直接返回.
  • DIRECTORY 关键字只在当前目录作用域或者其子目录作用域范围内曾经处理过该文件才直接返回.

 

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

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

相关文章

场景图生成——RelTR训练自己的数据集

RelTR训练自己的数据集 省流量省时间版本框的标注关系的标注总的 前言Open Images V6的标注格式RelTR中使用的Open Images V6的数据标注格式具体步骤框的标注生成格式关系三元组的生成格式 结束语参考链接 省流量省时间版本 框的标注 共需要创建4个json标注文件 train.json, …

本地部署 Stable Diffusion XL Gradio Demo WebUI

StableDiffusion XL Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradio De…

洛谷:P5016 龙虎斗 ← NOIP2018 普及组T2

【题目来源】https://www.luogu.com.cn/problem/P5016【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n 个兵营(自左至右编号 1∼n),相邻编号的兵营之间相隔 1 厘米,…

Learning Spatial and Spatio-Temporal Pixel

Learning Deformable Kernels for Image and Video Denoising 作者: Xiangyu Xu 商汤科技SenseTime Research 论文思想:一是将传统的双边滤波算法与CNN结合起来,二是用变形卷积来做多帧对齐的问题,三还是在raw上进行处理的。 …

Zookeeper集群 + Kafka集群 + Filebeat + ELK

目录 一:Zookeeper 概述 1、Zookeeper 定义 2、Zookeeper 工作机制 3、Zookeeper 特点 4、 Zookeeper 数据结构 5、 Zookeeper 应用场景 6、 Zookeeper 选举机制 (1)第一次启动选举机制 (2)非第一次启动选举机制…

JMeter 如何模拟不同的网络速度

目录 前言: 限制输出带宽以模拟不同的网络速度 将这两行添加到user.properties文件中(可以在JMeter安装的bin文件夹中找到此行) 通过-J 命令行参数传递属性的值,如下所示: 前言: JMeter可以通过使用不同…

【mysql】—— 数据库的操作

序言: 在上篇文章我已经对数据库进行了详细的介绍,接下来我们就将上手学习操作的细节了。本篇文章便带领大家去学习有关库操作的基本知识!!! 目录 (一)库的操作 1、 创建数据库 2、字符集和…

【深度学习笔记】训练 / 验证 / 测试集

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加,人口抚养比也在迅速攀升,越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针,作为机构养老…

第三方api对接怎么做?淘宝1688api接口怎么对接?

在今天的互联网上,第三方API对接是必不可少的。这种技术将不同的应用程序/服务连接在一起,创造了无限的可能性。 第三方api对接怎么做? 1、与支付公司签约 首先,通过正规的渠道,如支付公司官网或正规服务商&#xf…

如何让Stable Diffusion正确画手(1)-通过embedding模型优化图片质量

都说AI画手画不好手, 看这些是我用stable diffusion生成的图片,小姐姐都很漂亮,但手都千奇百怪,破坏了图片的美感。 其实只需要一个提示词,就能生成正确的手部,看这是我重新生成的效果,每一个小…

1、网络基础

网络发展背景、IP、端口、网络通信协议,TCP/IP五层模型、字节序 一、网络发展背景 局域网:网络覆盖在1000m以内的网络 城域网:网络覆盖在20km以内的网络 广域网:网络覆盖在20km以上的网络 因特网、互联网:更大的国…