cmake中宏中set参数的问题解惑

先看一下关键字:cmake的宏是MACRO,用法:

macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
endmacro()

定义一个名称为name的宏(函数),arg1...是传入的参数。我们除了可以用${arg1}来引用变量以外,系统为我们提供了一些特殊的变量:

变量说明
argv##是一个下标,0指向第一个参数,累加
argv所有的定义时要求传入的参数
argn定义时要求传入的参数以外的参数
argc传入的实际参数的个数,也就是调用函数是传入的参数个数

CMakeLists.txt
例1:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer arg = ${arg}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
arg = ABC
outer arg = abc

其余CMake的一些什么done信息我就省略了。

讲解:
其中设置set(arg “abc”)了,却没生效
查找了网上很多资料后才得知,macro(Moo arg)里面,会将${arg}的内容用实际传入宏的参数替换,set(arg “abc”)的作用只是设置了一个arg的变量,在最后一行打印出来的outer arg = abc就是这个set中arg的结果。

例2:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(hi "abc")
  message("# After change the value of arg.")
  message("1.hi = ${hi}")
  message("2.hi = ${${hi}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer hi = ${hi}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.hi = abc
2.hi = 
outer hi = abc

例1和例2来看,set(arg "abc")set(hi "abc") 都是设置了一个新的变量,在外部都打印出来了(最后一行)。唯一不同的是例子1中的set(arg "abc")这里的arg和macro(Moo arg) 中的长得一样 这个造成了我们理解的困难。

例子3:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(${arg} "abc")
  message("# After change the value of arg.")
  message("1.arg = ${arg}")
  message("2.arg = ${${arg}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer arg = ${arg}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.arg = ABC
2.arg = abc
outer arg = 

例3告诉我们要对macro(Moo arg)这里的arg进行重新设置,需要用set(${arg} "abc")这种方式,否则就不能达到我们的效果(和例子1进行对比得知)

message("1.arg = ${arg}")
message("2.arg = ${${arg}}")

1.arg = ABC
2.arg = abc

这个告诉我们,${arg}取到的值是macro(Moo arg)这里的,而${${arg}}的值是set(${arg} "abc")这里设置的。

例4:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(${hi} "abc")
  message("# After change the value of arg.")
  message("1.hi = ${hi}")
  message("2.hi = ${${hi}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer hi = ${hi}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.hi = 
2.hi = 
outer hi = 

例4完全是为了和例子3进行对比,${hi}是完全不存在的一个变量,它的值是空,不能对他进行设置,也取不到它的值(取到的是空)。

最后对比例1和例3,这个才是容易让我们困惑的, set(arg "abc")set(${arg} "abc") 长得相似,结果却不同,记住这点是容易出错的地方。

【CMake】cmake中的include指令(.cmake文件/MACRO宏/function函数)

cmake中宏的使用

CMake 宏修改输出参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值