[解決済み] CMakeにおける関数とマクロの比較
質問
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
.
関連
-
[解決済み】CMakeでソースディレクトリからバイナリディレクトリにファイルをコピーする
-
[解決済み] CMakeは "make uninstall "をサポートしていますか?
-
[解決済み] cmakeのincludeコマンドにおいて、ファイルとモジュールの違いは何ですか?
-
[解決済み] CMakeにおけるデバッグとリリースの比較
-
[解決済み] CMakeの出力をクリアするための'cmake clean'コマンドを探しています。
-
[解決済み] MakefileとCMakeを使ったコンパイルの違いについて
-
[解決済み] configure --prefix=DIR && make all install ' と同等のCMakeは何ですか?
-
[解決済み】CMakeでC++ 11を有効にするには?
-
[解決済み】CMakeでプリプロセッサー・マクロを定義する?
-
[解決済み] CMake target_include_directories スコープの意味
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】CMakeでソースディレクトリからバイナリディレクトリにファイルをコピーする
-
[解決済み] CMakeでポータブルパラレルビルドを設定するには?
-
[解決済み] CMAKE_SOURCE_DIRはどこですか?
-
[解決済み] CMakeのオプション()をコマンドラインで設定する方法
-
[解決済み] cmake --verbose=1` は冗長なcmake出力をしますが、`cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON` はそうならないのはなぜですか?
-
[解決済み】CMakeをGNU Makeと一緒に使う:正確なコマンドを見るにはどうすればいい?
-
[解決済み】変数を設定・使用するCMakeの構文とは?
-
[解決済み】CMakeは具体的にどのように動作するのですか?
-
[解決済み] CMakeはどのように使われるのですか?[クローズド]。
-
[解決済み] CMakeにソースディレクトリにある静的ライブラリをリンクするように指示するには?