3

cmake-macro の引数は、マクロの範囲内および範囲内で読み取り専用ですか?

次のコードを考慮します。

macro(test arg)
    message("output: ${arg}")
    set(arg "overwritten")
    message("output: ${arg}")
endmacro(test)

test("original")

出力は

output: original
output: original

この動作を変更する方法はありますか?

4

1 に答える 1

6

代わりに関数を使用します。

function(test arg)
    message("output: ${arg}")
    set(arg "overwritten")
    message("output: ${arg}")
endfunction(test)

マクロの CMake ドキュメントから:

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

ただし、マクロとは異なり、関数は新しいスコープを導入することに注意してください。したがってset、関数内で変数を使用するときはいつでもPARENT_SCOPE、パラメーターとして渡して、変更を呼び出し元に表示する必要があります。

于 2013-06-28T13:38:24.310 に答える