CMake中的函数与macros

CMake 2.8.12的官方文档讲述了macro

当它被调用时,macros中logging的命令首先通过用传递的参数replaceforms参数($ {arg1})来修改,然后作为普通命令调用。

和关于function

当它被调用时,函数中logging的命令首先通过用传递参数replaceforms参数($ {arg1})来修改,然后作为普通命令调用。

显然,两个引号几乎相同,但是让我困惑。 当像macros一样调用一个函数时,是否首先replace参数?

我在下面写了一个示例代码

 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 

所以,当调用Foo${arg}只是在调用Moo时用${var}replacestring时, arg被赋予了var的值。

所以我觉得上面这两个引号很容易混淆,虽然官方的文件也这么说

它们是stringreplace,就像C预处理器对macros的处理一样。 如果你想要真正的CMakevariables和/或更好的CMake范围控制,你应该看看函数命令。

换句话说,函数推送并popup新的variables作用域(创build和更改的variables仅存在于函数中),而macros则不会。 但是,您可以使用set命令的PARENT_SCOPE参数覆盖函数默认行为。