概述
本文介紹如何使用 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.第二次調用宏(宏內嵌套),需要在內層宏返回時,需要使用${}的方式傳參。