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

相关推荐

  1. cmake学习笔记2

    2024-04-06 12:28:02       13 阅读
  2. Cmake学习笔记3

    2024-04-06 12:28:02       12 阅读
  3. CMake 学习笔记(访问Python)

    2024-04-06 12:28:02       10 阅读
  4. CMAKE学习

    2024-04-06 12:28:02       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 12:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 12:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 12:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 12:28:02       18 阅读

热门阅读

  1. JVM专题——类文件结构

    2024-04-06 12:28:02       18 阅读
  2. 如何实现Docker容器数据的持久化存储?

    2024-04-06 12:28:02       12 阅读
  3. 字符串逆序

    2024-04-06 12:28:02       14 阅读
  4. electron入门教程

    2024-04-06 12:28:02       19 阅读
  5. 数据挖掘笔记

    2024-04-06 12:28:02       14 阅读
  6. C++ 枚举类型 ← 关键字 enum

    2024-04-06 12:28:02       15 阅读
  7. Client sent an HTTP request to an HTTPS server

    2024-04-06 12:28:02       15 阅读
  8. 服务限流的算法及其实现

    2024-04-06 12:28:02       15 阅读
  9. Spring AOP 详解

    2024-04-06 12:28:02       16 阅读