Yantao謝によって答えマクロ展開は、本当に私の目をオープン!
また、以下のチュートリアルには、可変スコープの概念を理解するのに役立つ具体的な例がいくつか含まれていることがわかりました。
15分でLearncmakeから引用:
CMakeでは、function
/endfunction
コマンドのペアを使用して関数を定義できます。これは、引数の数値を2倍にして、結果を出力するものです。
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
関数は独自のスコープで実行されます。関数で定義された変数はいずれも、呼び出し元のスコープを汚染しません。値を返したい場合は、変数の名前を関数に渡してからset
、特別な引数を指定してコマンドを呼び出すことができますPARENT_SCOPE
。
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
同様に、macro
/endmacro
コマンドのペアはマクロを定義します。関数とは異なり、マクロは呼び出し元と同じスコープで実行されます。したがって、マクロ内で定義されたすべての変数は、呼び出し元のスコープに設定されます。前の関数を次のように置き換えることができます。
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
関数とマクロはどちらも、任意の数の引数を受け入れます。名前のない引数は、という名前の特別な変数を介して、リストとして関数に公開されARGN
ます。
受け取るすべての引数を2倍にして、それぞれを別々の行に出力する関数を次に示します。
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
function
とmacro
:のセマンティクスにはかなり明らかな違いがありますが、少なくとも1つの重要な違いがあります。でreturn()
使用macro
すると、マクロからではなく、呼び出し元の関数から戻ります。