5

ここでcmake と変数の受け渡しについて質問しました。私はそれを機能させることができますが、関数を呼び出す親スコープの変数とは異なる名前を関数に付けた場合にのみです。つまり、本質的に:

function(strange name)
   message(STATUS ${name})
   message(STATUS ${${name}})
endfunction()

set(name foo)
set(anothername foo)
strange(name)
strange(anothername)

結果は次のとおりです。

-- name   (message(STATUS ${name}) for var "name")
-- name   (message(STATUS ${${name}}) for var "name")
-- anothername message(STATUS ${name}) for var "anothername")
-- foo    (message(STATUS ${${name}}) for var "anothername")

ちょっと変じゃない?何が起こっていますか?関数の動作は、親スコープ内の変数の命名に依存すべきではないと思います-そうすべきですか?!

説明をいただければ幸いです。

4

2 に答える 2

8

残念ながら、CMake の言語は非常に原始的です。この場合、ローカル変数の命名は、外部スコープの同じ名前の変数と相互作用する可能性があります。

具体的には、2 つの呼び出しで、それぞれとに${${name}}展開されます。前者は、値が使用されるローカル変数の名前です。後者では、外側のスコープからの が使用されます。${name}${anothername}nameanothername

関数で難読化された変数名を使用して変数名を引数として受け入れることを除いて、これを回避する方法はわかりません。

たぶん${name:PARENT_SCOPE}、CMake チームから請願する必要がありますか?

于 2013-01-18T11:22:58.190 に答える
4

@Lindydancerの簡潔な回答で説明されているローカルスコープの問題を回避したい場合は、関数を次のように変更できます。macro

のドキュメントからmacro

マクロのパラメーターやARGNなどの値は、通常のCMakeの意味では変数ではないことに注意してください。これらは、cプリプロセッサがマクロで行うのとよく似た文字列置換です。真のCMake変数が必要な場合は、関数コマンドを確認する必要があります。

を使用するように変更するmacroと、出力は次のようになります。

-- name
-- foo
-- anothername
-- foo
于 2013-01-19T05:14:47.030 に答える