目录
共同点--形式类似
macro的形式
function的形式
不同点
1 输入参数的替换阶段不同
macro
function
2 输入参数作用域不同
macro
function
共同点--形式类似
macro的形式
macro(宏名 输入参数名)....
endmacro()
function的形式
function(函数名 输入参数名).....
endfunction()
不同点
1 输入参数的替换阶段不同
macro
macro在执行其体内的第一条语句之前,就把体内所有的"${输入参数名}"替换成调用macro时的内容。简言之,替换发生在执行前,且替换遍布体内所有的${输入参数名},但是没有${}的地方,替换不会发生。比如说:
macro(test in)set(in "2")message("in = "${in})
endmacro()test(1)
在执行set(in "2")之前,message("in = "${in})的内容已经被替换成message("in = 1"),所以set(in "2")对后面的语句没有影响,仍然输出1。(事实上,set(in "2")把in当成了一个新的全局变量,后面还会提到)。macro的行为类似c语言里的编译时。
function
function在执行时,才将输入变量的值赋给体内的第一条执行语句,但是赋值仅限于第一次调用输入参数时。类似c语言的运行时。
function(test in)message("in = "${in})set(in "2")message("in = "${in})
endfunction()test(1)
可见,test(1)调用时,in = 1,但是set(in "2")随后将in 改为2.所以接下来打印in = 2
2 输入参数作用域不同
macro
cmake_minimum_required(VERSION 3.0)
macro(test in)message("in = "${in})set(in "2")message("in = "${in})
endmacro()test(1)message("in = "${in})
开头打印两个1的原因前面已经解释了。为什么最后在macro调用之外,又打印了2呢?因为macro的set(in "2")又定义了一个新的变量in,并赋值2。而且这个新变量的作用域超过了macro的作用域(事实上,macro根本没有作用域),在test(1)调用结束后,新变量仍存在。类比c语言里的define宏,define本身并没有作用域。同样,macro也仅仅在被调用处展开其体内语句而已,macro本身没有作用域。所以test(1)调用后,仍可以打印in = 2
function
cmake_minimum_required(VERSION 3.0)
function(test in)message("in = "${in})set(in "2")message("in = "${in})
endfunction()test(1)message("in = "${in})
前面说了,与macro不同,function内部确实有一个 变量in。这也是set(in "2")起作用的原因。但是这个变量在离开function作用域之后即消失。所以test(1)之后的message语句打印不出in。参考c语言的函数(与#define相对)。