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 命令所在的作用域中。
下一篇文章来学习 函数的返回值是如何实现。

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

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

相关文章

C++:多继承虚继承

在C中,虚继承(Virtual Inheritance)是一种特殊的继承方式,用于解决菱形继承(Diamond Inheritance)问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类,从而导致了多个实例同一个…

Problem 5: Whack-A-Mole打地鼠

实战题:打地鼠 内容如附件所示: 测试数据为:1,2,4,8,9,10,11,14 答案为:10,2,4 原始分布: 击打10号 击打2号 击打4号 要求,所示实例解以图示的方式给出,并且5组测试数据都需要测试,…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具,专为Mac用户打造,旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式,用户可轻松创建各种标签、信封和卡片,满足个性化需…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具,其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先,PopChar为Mac提供了访问所有字体字符的能力,包括那些难以通过键盘直接输入的字符。用户只…

STM32编译前置条件配置

本文基于stm32f104系列芯片,记录编程代码前需要的操作: 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0,解压后,得到以下界面 启动文件 进入Libraries,然后进入CMSIS,再进入CM3&#xff…

青春送温暖 立夏寄真情

(通讯员:赵灿飞 图:杨美、孙红浪) 在青春洋溢的五月,为传承中华民族尊老敬老的传统美德,促进当代青年与老人的跨代交流,增强青年的社会责任感和使命感,传递正能量和关爱困难群体…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获: 二叉树的递归遍历二叉树的迭代遍历,中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现(要处理的节点放入栈之后,紧接着放入一个空指针作为标记) 二叉树理论基础篇 题目分类 题目分…

第一篇:刚接触测试你应该知道什么

欢迎你接触软件测试这一行业。 刚接触它时,你肯定或多或少会有疑惑,我该做什么?大家口口相传的软件测试就是 【点点点】 真的是你日常的工作吗? 那么本文我将陪你一起,对我们刚接触到测试这个工作以后,应该…

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

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下: cmake进阶:变量的作用域-CSDN博客 本文继续从函数作用域方面学习了 变量的作用域。 二. 变量的作用域 1. 函数内定义与外部同名的变量 向顶层 CMakeLists.txt添加如下代码&a…

java08基础(值传递和引用传递 类和对象)

目录 一. 值传递和引用传递 1. 值传递 2. 引用传递 二. 面向对象思想 三. 类和对象 1. 类 2. 对象 2.1 使用 2.2 成员变量和局部变量区别 2.3 操作成员方法 2.4 this关键字(初始) 2.5 构造方法 (见java09) 一. 值传递和引用传递 1. 值传递 值传递是指在调用函数时将…

Open CASCADE学习|三重正交标架法则

三重正交标架(Trihedron) 定义:三重正交标架是在三维空间中定义的一个坐标系,由三个互相垂直的向量构成。这些向量分别是: 切线向量(Tangent Vector) - 表示曲线在某一特定点处的切线方向。 主法线向量&…

越权漏洞!

越权漏洞是指在一个系统或应用程序中存在某种不当的访问权限,使得攻击者可以获得比其应该拥有的权限更高的权限。这种漏洞可能允许攻击者执行未经授权的操作,例如访问他人的敏感数据、修改系统设置、执行恶意代码等。越权漏洞通常是由于设计或实现上的错…

淡茶怎么泡?

很多人都知道喝浓茶对身体不好,但是怎么冲泡淡茶却一知半解。按照《品深淡茶冲泡标准》中对绿茶冲泡淡茶的规定,冲泡的茶汤中咖啡碱不得高于31.67mg/100mL,可可碱不得高于2.67mg/mL,茶碱不得高于1.50mg/100mL,茶多酚不…

[C++核心编程-03]----C++函数提高学习

目录 引言 正文 01-函数提升简介 02-函数默认参数 03-函数占位参数 04-函数重载 05-函数重载的注意事项 总结 引言 函数在C编程中扮演着至关重要的角色,通过合理使用函数,可以提高程序的结构性、灵活性、可读性和维护性。因此&…

Guer完成对Gallium Semi的GaN产品组合的收购

预计到2024年6月,完整的射频氮化镓产品组合将完成整合 总部位于美国的Guerrilla RF (GUER)已完成对镓半导体公司GaN功率放大器和前端模块的全部收购。 自2024年4月26日起,GUER收购了Gallium Semiconductor先前发布的所有组件以及正在开发的新内核。此外…

软件测试与管理-白盒测试-基本路径测试法

知识点: 1.原理 是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径的集合,然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例需保证被测程序的每个可执行语句至少执行一次。 2.步骤 &a…

计算机SCI期刊,中科院2区,IF=6+,自引率低,专业认可度高!

一、期刊名称 Journal of King Saud University-Computer and Information Sciences 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:6.9 中科院分区:2区 出版方式:开放出版 版面费:$…

开源模型 Prometheus 2 能够评估其他语言模型,其效果几乎与 GPT-4 相当

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

在Codelab对llama3做Lora Fine tune微调

Unsloth 高效微调大模型的工具,通过Unsloth微调Llama3, Mistral, Gemma 速度提升2-5倍,内存减少70%! Codelab 创建一个jupyter notebook 选择 T4 GPU 安装Fine tune 相关的lib %%capture import torch major_version, minor_version torch…