大连建设网官方网站,开发商延期交房怎么办,哪个公司做网站好 知乎,宁波人流医院目录
共同点--形式类似
macro的形式
function的形式
不同点
1 输入参数的替换阶段不同
macro
function
2 输入参数作用域不同
macro
function 共同点--形式类似
macro的形式
macro(宏名 输入参数名)....
endmacro()
function的形式
function(函数名 输入参数名).…目录
共同点--形式类似
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相对。