概述
本文介绍如何使用 CMake 宏在多层嵌套的过程中正确获得输出变量的值。
project(test_macro)
# 第三层调用宏
macro(macro_inner var)
# 第三层嵌套向输出变量追加内容
set(${var} ${${var}} "inner")
message(STATUS "macro_inner ${var} = ${${var}}")
# macro_inner output_var = abc;inner
endmacro()
# 第二层调用宏
macro(macro_handle var)
message(STATUS "${ARGN}")
# 空内容,调用宏是没有指定额外参数,此处为空
set(${var} "abc")
message(STATUS "macro_handle var=${var} ${var}=${${var}}")
# macro_handle var=output_var output_var=abc
# 可以看出 ${var} 的值是 output_var,${${var}} 才是实际的数据内容。
# 第三层嵌套,内部追加输出变量的内容
# 传递变量名 output_var
macro_inner(${var})
message(STATUS "macro_handle-macro_inner ${var}=${${var}}")
# macro_handle-macro_inner output_var=abc;inner
endmacro()
# 第一层调用宏
macro(macro_warp var)
# ARGV0, ARGV1 分别代表参数1和参数2
# ARGN 表示 var 之后的所有参数,可以通过 foreach 的方式遍历获取内容,非常方便传递同类型但不限数量的变量
message(STATUS "ARGV0=${ARGV0} ARGV1=${ARGV1} ARGN=${ARGN}")
# ARGV0=output_var ARGV1=args_1 ARGN=args_1;args_2
message(STATUS "var=${var}")
# var=output_var
# 可以看出 var 的值 ${} 才是真正返回变量
# 调用宏,在宏内设置变量的内容
# 注意:此处需要将 var 的变量传递给内层宏,才能保证内部修改的变量内容外层可获得
macro_handle(${var})
message(STATUS "macro_warp var = ${var} ${var} = ${${var}}")
# macro_warp var = output_var output_var = abc;inner
endmacro()
# 定义宏,将输出的结果保存在变量到 output_var
macro_warp(output_var "args_1" "args_2")
message(STATUS "output_var = ${output_var}")
# output_var = abc;inner
小结
- 1.第一次调用宏,返回值传参直接提供保存返回结果的变量名称
- 2.第二次调用宏(宏内嵌套),需要在内层宏返回时,需要使用${}的方式传参。