cmake进阶:变量的作用域说明三(从函数作用域方面)

 一.  简介

前一篇文章从函数作用域方面学习了 变量的作用域。文章如下:

cmake进阶:变量的作用域说明一(从函数作用域方面)-CSDN博客
cmake进阶:变量的作用域说明二(从函数作用域方面)-CSDN博客

本文继续从函数作用域方面学习了 变量的作用域。

二.  变量的作用域

1. 函数内如何设置外部定义的变量

那如果需要在函数内修改外部定义的变量,该如何做呢?

譬如下面这段代码:

# 函数 xyz
function(xyz)
 set(ABC "Hello China!")
endfunction()

set(ABC "Hello World!")
xyz() # 调用函数

message("${ABC}")

通过前面的介绍可知,xyz()函数内通过 set 只是创建了一个在函数内部使用的变量 ABC,而并非是去修改外部定义的变量 ABC,那如何能使得函数内可以去修改外部定义的变量呢?

其实也非常简单,set 命令提供了一个可选选项 PARENT_SCOPE,只需在调用 set 命令时在参数列表末尾加上 PARENT_SCOPE 关键字即可。如下所示:

# 函数 xyz
function(xyz)
 set(ABC "Hello China!" PARENT_SCOPE) #加上 PARENT_SCOPE
endfunction()

set(ABC "Hello World!")
xyz() # 调用函数

message("${ABC}")

将上面代码添加到 工程的顶层 CMakeLists.txt文件,进入 build目录下,执行 "cmake .."命令后打印如下信息:

打印信息证明,加上 PARENT_SCOPE 之后确实可以,那 PARENT_SCOPE 选项究竟是什么?

官方给出的解释是这样的:

如果添加了 PARENT_SCOPE 选项,则变量将设置在当前作用域范围之上 的作用域范围内,每个目录(在这里“目录”指的是包含了 CMakeLists.txt 的目录)或函数都会创建一个新作用域,此命令会将变量的值设置到父目录或上层调用函数中(函数嵌套的情况下)。

其实就是说,如果 set 命令添加了 PARENT_SCOPE 选项,那就意味着并不是在当前作用域(set 命令所在作用域)内设置这个变量,而是在当前作用域的上一层作用域(父作用域)中设置该变量;

三.  举例说明 “当前作用域的上一层作用域 ”

当前作用域的上一层作用域该怎么理解呢?
这个根据具体的情况而定,下面举几个例子进行说明。

1. 示例代码 1

示例代码如下:

# 函数 xyz
function(xyz)
 set(ABC "Hello China!" PARENT_SCOPE) #加上 PARENT_SCOPE
endfunction()

set(ABC "Hello World!")
xyz() # 调用函数

message("${ABC}")
在这个例子中,函数 xyz 中调用 set 时添加了 PARENT_SCOPE 选项,意味着会在函数 xyz 的上一层作 用域中设置 ABC 变量,函数的上一层作用域也就是调用 xyz() 函数时所在的作用域,也就是当前源码对应 的作用域(当前目录作用域)。

2. 示例代码 2

示例代码如下:

# 函数 func2
function(func2)
 set(ABC "Hello People!" PARENT_SCOPE)
endfunction()

# 函数 func1
function(func1)
 set(ABC "Hello China!")
 func2()
endfunction()

set(ABC "Hello World!")
func1()

message("${ABC}")
在这个示例中,函数 func1 中调用了 func2 ,那么函数 func2 的上一层作用域就是 func1 函数对应的作用域。

3. 示例代码 3

有如下工程目录结构:

顶层 CMakeLists.txt 文件内容如下:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(TEST)

add_subdirectory(src)
xyz()

message("${ABC}")

顶层源码调用 src 目录下的子源码,子源码下定义了一个函数 xyz ,如下所示:

# src 下的 CMakeLists.txt
function(xyz)
 set(ABC "Hello World!" PARENT_SCOPE)
endfunction()

在这种情况下,函数 xyz 的上一层作用域便是顶层目录作用域(顶层源码作用域),关键是看“谁”调用该函数。

同理下面这种情况也是如此,顶层 CMakeLists.txt 文件:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(TEST)
add_subdirectory(src)
message("${ABC}")

src 目录下的 CMakeLists.txt 文件:
# src 下的 CMakeLists.txt
set(ABC "Hello World!" PARENT_SCOPE)
变量 ABC 会在顶层源码中被设置,而不是 set 命令所在的作用域中。
下一篇文章来学习 函数的返回值是如何实现。

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

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

相关文章

VALSE 2024年度进展评述内容分享-视觉通用人工智能

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

优雅处理返回信息状态码:Result对象在Spring Boot中的应用

前言 在开发过程中,处理返回的信息状态码是一个重要的问题,尤其是在大型项目中。为了统一处理这些状态码,我在Spring Boot中创建了一个名为Result的Java对象,用于封装返回的信息和状态码。在本文中,我将分享如何实现这…

【C++题解】1435. 数池塘(八方向)

问题:1435. 数池塘(八方向) 类型:深搜 题目描述: 农夫约翰的农场可以表示成 NM(1≤N,M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。 每一个方格或…

重写muduo之获取线程tid代码

目录 1、概述 2、CurrentThread.h 3、 CurrentThread.cc 1、概述 我们的服务器程序不一定就只有1个Eventloop,我们可能有很多的Eventloop,每个Eventloop都有很多channel,自己channel上的事件要在自己的Eventloop线程上去处理,E…

免费开源的tiktok加速软件

背景 tiktok是国内企业出海做的比较成功的案例,可以简单的理解为海外版的抖音,关于tiktok的运营和变现不是我们擅长的领域,这里就不多说了,这篇文章主要着重在解决tiktok的网络问题,介绍如何用开源的软件自己搭建一套…

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH(安全性)1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙(UFW)锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

SpringMVC简介和体验

一、SpringMVC简介和体验 1.1 介绍 Spring Web MVC :: Spring Framework Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc )&#…

算法学习007-进制转换 c++递归算法实现 中小学算法思维学习 信奥算法解析

目录 C进制转换 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C进制转换 一、题目要求 1、编程实现 小明学c有一段时间了,今天他想做一个进制转换的小程序,将十进…

LEETCODE LCR 041. 数据流中的移动平均值

class MovingAverage:def __init__(self, size: int):"""Initialize your data structure here."""self.sizesize1self.front0self.rear0self.queue[None for _ in range(size1)]self.sum0def next(self, val: int) -> float:# 满了if (self.…

flutter 生成单选组件

一、效果图 二、主要代码 import package:company_manage_flutter/xcClass/dicDataProp.dart; import package:flutter/material.dart; import package:get/get.dart;class CheckListWidget extends StatefulWidget {final List<Map<String, dynamic>> list;final…

Vue中Element的下载

打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…

【目标检测】Deformable DETR

一、前言 论文&#xff1a; Deformable DETR: Deformable Transformers for End-to-End Object Detection 作者&#xff1a; SenseTime Research 代码&#xff1a; Deformable DETR 特点&#xff1a; 提出多尺度可变形注意力 (Multi-scale Deformable Attention) 解决DETR收敛…

已解决 RuntimeError: No CUDA GPUs are available 亲测有效!!!

已解决 RuntimeError: No CUDA GPUs are available 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 RuntimeError: No CUDA GPUs are available 这个错误通常发生在尝试在没有CUDA支持的GPU或没有安装NVIDIA GPU的机器上运行基于C…

Hamilton回路求解

如果可以 我想和你回到那天相遇 让时间停止 那一场雨 红线划过 深藏轮回的秘密 我挥霍运气 因为你 才让我 背对命运不害怕 --------- 如果可以 (Acapella) - 韦礼安 大家好&#xff0c;我又又又来了&#xff0c;今天给大家聊聊Hamilton回路&#xff01; 背景 国际象…

使用CUDA的PyTorch进行张量重整化的gpu加速

使用CUDA的PyTorch进行张量重整化的gpu加速 摘要IntroductionAlgorithm and TorchTrg discussionModels and Results GPU-Acceleration of Tensor Renormalization with PyTorch using CUDA 摘要 作者展示了基于张量重整化群&#xff08;TRG&#xff09;方法的数值计算可以通过…

HarmonyOS NEXT星河版之在线考试功能实战

文章目录 一、目标二、基础搭建2.1 定义数据2.2 mock数据2.3 主页面布局2.3.1 布局规划2.3.2 标题栏2.3.3 进度条2.3.4 答题模块2.3.5 底部按钮 2.4 主页面逻辑2.4.1 加载数据及定义变量2.4.2 上一题、下一题 三、选项点击及高亮3.1 声明对象及变量3.2 给选项注册点击事件3.3 处…

AI图书推荐:Zapier和AI融合来自动化业务流程

这本书《Zapier和AI融合来自动化业务流程》&#xff08;Automate It with Zapier and Generative AI&#xff09;由Kelly Goss撰写&#xff0c;这本书是为想要使用Zapier和AI集成功能来自动化重复性任务、提高生产力的微型、小型或中型企业的业务所有者、运营经理和团队准备的。…

C++入门基础(四)

目录 auto关键字(C11)类型别名思考auto的使用细则auto与指针和引用结合起来使用在同一行定义多个变量 auto不能推导的场景auto不能作为函数的参数auto不能直接用来声明数组 复杂场景下的auto 基于范围的for循环(C11)范围for的语法范围for的使用条件 指针空值---nullptr(C11)C98…

电商核心技术揭秘四十九:智能广告投放与效果评估

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

饥荒服务器搭建centos

服务器环境需要64位32位不可用 uname -r 查看服务器版本 更新yum sudo yum update 安装依赖环境 sudo yum -y install glibc.i686 libstdc.i686 libcurl4-gnutls-dev.i686 libcurl.i686 screen 安装steam cd /home && mkdir steamcmd && cd steamcmd 国…