1. ホーム
  2. cmake

[解決済み] CMakeにおける関数とマクロの比較

2022-12-06 15:03:49

質問

CMake 2.8.12 の公式ドキュメント には、以下のように書かれています。 macro

起動されると、マクロに記録されているコマンドはまず 形式パラメータ(${arg1})を渡された引数に置き換えて変更され、その後通常のコマンドとして起動されます。 に置き換えられ、通常のコマンドとして起動されます。

について、また function

この関数が起動されると、関数に記録されているコマンドはまず 関数に記録されたコマンドは、まず形式パラメータ(${arg1})を渡された引数に置き換えて修正された後、通常のコマンドとして起動されます。 に置き換えられ、通常のコマンドとして起動されます。

明らかに、2つの引用はほとんど同じですが、混乱します。パラメータ置換は関数とマクロで同じように動作するのでしょうか?

どのように解決するのですか?

以下にサンプルコードを書いてみました。

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})

function(Foo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(${var})

と出力されます。

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

ということで、どうやら arg の値が代入されます。 var を呼び出すと Foo${arg} は単に文字列を ${var} を呼び出すと Moo .

ということで、上の2つの引用は非常に混乱しやすいと思うのですが、公式文書にはこうも書かれていました。 その :

なお、この パラメータ をマクロに、そして などは、通常のCMakeの意味での変数ではありません。それらは C プリプロセッサーがマクロで行うような文字列置換です。 マクロで行うような文字列の置き換えです。もし、本当のCMake変数やより良いCMakeのスコープコントロールが必要なら、functionコマンドを見るべきです。 のスコープを制御したいのであれば、functionコマンドを見るべきです。

更新 (1/29/2021)

文の後に以下の文を追加します。 Moo(${var}) を追加して、マクロと関数の違いをさらに明確にします。

message(${arg})

このステートメントは、以下のように出力します。 abc .