CMake学习笔记(三)区分macro与function

目录

共同点--形式类似

macro的形式

function的形式

不同点

1 输入参数的替换阶段不同

macro

function

2 输入参数作用域不同

macro

function


共同点--形式类似

macro的形式

macro(宏名 输入参数名)....
endmacro()

function的形式

function(函数名 输入参数名).....
endfunction()

不同点

1 输入参数的替换阶段不同

macro

macro在执行其体内的第一条语句之前,就把体内所有的"${输入参数名}"替换成调用macro时的内容。简言之,替换发生在执行前,且替换遍布体内所有的${输入参数名},但是没有${}的地方,替换不会发生。比如说:

macro(test in)set(in "2")message("in = "${in})
endmacro()test(1)

 在执行set(in "2")之前,message("in = "${in})的内容已经被替换成message("in = 1"),所以set(in "2")对后面的语句没有影响,仍然输出1。(事实上,set(in "2")把in当成了一个新的全局变量,后面还会提到)。macro的行为类似c语言里的编译时

f84cdd7116d5421fb52b3907fa4d1a07.jpeg

function

function在执行时,才将输入变量的值赋给体内的第一条执行语句,但是赋值仅限于第一次调用输入参数时。类似c语言的运行时

function(test in)message("in = "${in})set(in "2")message("in = "${in})
endfunction()test(1)

7f5f1ac2f7a04d34a106a1855366e534.jpeg可见,test(1)调用时,in = 1,但是set(in "2")随后将in 改为2.所以接下来打印in = 2 

2 输入参数作用域不同

macro

cmake_minimum_required(VERSION 3.0)
macro(test in)message("in = "${in})set(in "2")message("in = "${in})
endmacro()test(1)message("in = "${in})

00fc8ec30989459ca16360ce8c9222e4.jpeg

开头打印两个1的原因前面已经解释了。为什么最后在macro调用之外,又打印了2呢?因为macro的set(in "2")又定义了一个新的变量in,并赋值2。而且这个新变量的作用域超过了macro的作用域(事实上,macro根本没有作用域),在test(1)调用结束后,新变量仍存在。类比c语言里的define宏,define本身并没有作用域。同样,macro也仅仅在被调用处展开其体内语句而已,macro本身没有作用域。所以test(1)调用后,仍可以打印in = 2

function

cmake_minimum_required(VERSION 3.0)
function(test in)message("in = "${in})set(in "2")message("in = "${in})
endfunction()test(1)message("in = "${in})

3aca8efefcdb4493b3d558415c73c7b5.jpeg

前面说了,与macro不同,function内部确实有一个 变量in。这也是set(in "2")起作用的原因。但是这个变量在离开function作用域之后即消失。所以test(1)之后的message语句打印不出in。参考c语言的函数(与#define相对)。

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

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

相关文章

20232831 2023-2024-2 《网络攻防实践》第5次作业

目录 20232831 2023-2024-2 《网络攻防实践》第5次作业1.实验内容(1)防火墙配置(具体IP配置参考自己的IP设置)(2)动手实践:Snort(3)分析配置规则 2.实验过程3.学习中遇到…

基于小程序实现的校园失物招领系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址,也是父数组的首地址,也是子数组的首地址 arr1父数组的地址偏移1,实际上是偏移了4*416个字节 arr[0]是子数组的首地址,arr[0]1是子数…

langchain txt 文档加载,分割

stuff 策略 加载 arXiv 论文,让模型总结前 2000 字 这里采用的是 stuff 策略,也就是将一大段文本。按字数分割成 N 个文本块,又合并成一个大的文本块。 对超大规模不友好,没有区分文档重要性,适合文档量较少场景 i…

安卓刷机fastboot分段传输

win10 fastboot 无法识别,驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中,如果只是做一个简单的单元测试(不涉及端到端、数据库交互、API调用、消息队列处理等),我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

Redis中的集群(六)

集群 ASK错误 在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令&#xf…

C中自定义类型——结构体

一.前言 在C语言中,不仅有int、char、short、long等内置类型,C语言还有一种特殊的类型——自定义类型。该类型可以由使用者自己定义,可以解决一些复杂的个体。 二.结构体 2.1结构体的声明 我们在利用结构体的时候一般是用于描述一些有多种…

javaweb配置JSTL

首先配置好javaweb项目。 在网上下载好jakarta-taglibs-standard并解压。 在web/WEB-INF目录下创建lib目录。 在jakarta-taglibs-standard目录下lib目录内的两个.jar文件复制到javaweb项目lib目录下。 将这两个.jar包导入库。 在idea菜单栏找到“文件”并打开,点…

nvm更新node版本

1、nvm安装和管理多个 Node.js 版本:NVM 允许用户在计算机上同时安装多个不同版本的 Node.js。这使得开发人员可以轻松地在不同的项目中使用不同的 Node.js 版本,而无需手动安装或卸载。 2、nvm切换 Node.js 版本:通过 NVM,用户可…

好菜每回味道不同--建造者模式

1.1 炒菜没放盐 中餐,老板需要每次炒菜,每次炒出来的味道都有可能不同。麦当劳、肯德基这些不过百年的洋快餐却能在有千年饮食文化的中国发展的那么好呢?是因为你不管何时何地在哪里吃味道都一样,而鱼香肉丝在我们中餐却可以吃出上…

Langchain-Chatchat 从入门到精通(基于本地知识库的问答系统)(更新中)

目录 前言一、Langchain-Chatchat介绍1-1、Langchain-Chatchat介绍1-2、LangChainChatGLM 工作流1-3、文档角度的工作流 二、快速上手2-0、硬件要求2-1、环境配置2-2、模型下载2-3、初始化知识库和配置文件2-4、一键启动 三、配置文件详解(config目录下)…

MybatisPlus实现数据权限隔离

引言 Mybatis Plus对Mybatis做了无侵入的增强,非常的好用,今天就给大家介绍它的其中一个实用功能:数据权限插件。 数据权限插件的应用场景和多租户的动态拦截拼接SQL一样。建议点赞收藏关注,方便以后复习查阅。 依赖 首先导入M…

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别?2. ArrayList 和 Array(数组)的区别?3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?(了解即可)5. ArrayList 可以添加 null 值吗…

【端云一体化开发】云函数本地运行/调试启动失败的两种解决方案

最近本地调试云函数一直出现这个错误:Before launch task execute failed! details:java.lang.lllegalStateException: npm installfailed 这个问题的原因似乎是运行云函数的时候会重新下载 npm 及相关依赖文件,但是 DevEco 的 npm 模块出错导致这个步骤…

智慧园区平台再升级!智慧迭代,服务升级

伴随物联网、人工智能等技术的迅速发展和智能化水平的提高,智慧园区成为了现代区域经济高质量发展的重要组成部分,上承智慧城市的建设,下接智慧运营和管理。智慧园区是一种基于信息技术的智能化管理模式,通过物联网、大数据、人工…

java中常见的几种排序

常见的几种排序整理 冒泡排序选择排序插入排序希尔排序快速排序归并排序堆排序 冒泡排序 思想:对比当前值的下一个值,如果大就交换位置 代码: /*** 冒泡排序*/ public class bubbleSort {public static void main(String[] args) {int[] ar…

【域适应】深度域适应常用的距离度量函数实现

关于 深度域适应中,有一类方法是实现目标域和源域的特征对齐,特征对齐的衡量函数主要包括MMD,MK-MMD,A-distance,CORAL loss, Wasserstein distance等等。本文总结了常用的特征变换对齐的函数定义。 工具 …

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…

OpenHarmony南向开发案例:【智能保险柜】

样例简介 智能保险柜实时监测保险柜中振动传感器,当有振动产生时及时向用户发出警报。在连接网络后,配合数字管家应用,用户可以远程接收智能保险柜的报警信息。后续可扩展摄像头等设备,实现对危险及时报警,及时处理&a…