CMake 2.8.12的官方文件说明了这一点macro
调用它时,首先通过用传递的参数替换形式参数($ {arg1})来修改宏中记录的命令,然后作为普通命令调用.
而且 function
调用它时,首先通过用传递的参数替换形式参数($ {arg1})来修改函数中记录的命令,然后将其作为普通命令调用.
显然,两个引号几乎相同但令我困惑.在像宏一样调用函数时,首先替换参数吗?
Yan*_*Xie 82
我在下面写了一个示例代码
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})
Run Code Online (Sandbox Code Playgroud)
而输出是
=== Call macro ===
arg = ABC
# After change the value of arg.
arg = ABC
=== Call function ===
arg = ABC
# After change the value of arg.
arg = abc
Run Code Online (Sandbox Code Playgroud)
因此,似乎arg分配了var调用时的值,Foo并且${arg}只是${var}在调用时替换了字符串Moo.
所以我认为上述两个引号很容易让人感到困惑,尽管官方文件也说过
它们是字符串替换,就像C预处理器使用宏一样.如果您想要真正的CMake变量和/或更好的CMake范围控制,您应该查看function命令.
您引用的cmake文档是如此令人误解,以至于基本上是错误的。应该这样澄清/修复:
cmake --trace-expand 准确显示发生了什么。
与此相比,cmake 3.13.3文档与2.8.12相比没有变化。