当前位置: 首页 > news >正文

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相对)。

相关文章:

  • 钉钉自建应用-下载excel(h5)
  • 插值表达式
  • 【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用
  • 文件操作详解
  • 蓝桥杯刷题-14-更小的数-区间DP⭐
  • windows or ubuntu mount 文件
  • 初学python记录:力扣1600. 王位继承顺序
  • 【微服务】面试题(一)
  • 鸿蒙原生应用已超4000个!
  • 【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型
  • 【Frida】【Android】 10_爬虫之WebSocket协议分析
  • LeetCode题练习与总结:螺旋矩阵Ⅱ--59
  • 第十四届蓝桥杯C/C++大学B组题解(一)
  • 智慧港口多场景解决方案(一)
  • JS详解-设计模式
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 230. Kth Smallest Element in a BST
  • es的写入过程
  • Git学习与使用心得(1)—— 初始化
  • JavaScript服务器推送技术之 WebSocket
  • js操作时间(持续更新)
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • React-flux杂记
  • react-native 安卓真机环境搭建
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 前端性能优化——回流与重绘
  • 浅谈Golang中select的用法
  • 什么软件可以剪辑音乐?
  • 微信小程序开发问题汇总
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • - 转 Ext2.0 form使用实例
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #pragam once 和 #ifndef 预编译头
  • $.ajax()方法详解
  • (Python) SOAP Web Service (HTTP POST)
  • (ZT)薛涌:谈贫说富
  • (备忘)Java Map 遍历
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一一四)第九章编程练习
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)scrum常见工具列表
  • (转)菜鸟学数据库(三)——存储过程
  • ****Linux下Mysql的安装和配置
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 受管制代码
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net6Api后台+uniapp导出Excel
  • .NET构架之我见
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?