定义一个名称为name的宏(函数),arg1…是传入的参数。我们除了可以用${arg1}
来引用变量以外,系统为我们提供了一些特殊的变量:
变量 | 说明 |
---|---|
ARGV# | #是一个下标,0指向第一个参数,累加 |
ARGV | 所有的定义时要求传入的参数 |
ARGN | 定义时要求传入的参数以外的参数,比如定义宏(函数)时,要求输入1个,书记输入了3个,则剩下的两个会以数组形式存储在ARGN中 |
ARGC | 传入的实际参数的个数,也就是调用函数是传入的参数个数 |
macro宏定义与function函数的不同点
宏的ARGN、ARGV等参数不是通常CMake意义上的变量。 它们是字符串替换,很像C预处理器对宏的处理。 因此,如下命令是错误的:
if(ARGV1) # ARGV1 is not a variable
if(DEFINED ARGV2) # ARGV2 is not a variable
if(ARGC GREATER 2) # ARGC is not a variable
foreach(loop_var IN LISTS ARGN) # ARGN is not a variable
正确写法如下:
if(${ARGV1})
if(DEFINED A R G V 2 ) i f ( {ARGV2}) if( ARGV2)if({ARGC} GREATER 2)
foreach(loop_var IN LISTS A R G N ) o r s e t ( l i s t v a r " {ARGN}) or set(list_var " ARGN)orset(listvar"{ARGN}")
foreach(loop_var IN LISTS list_var)
一个简单的例子
macro(FOO arg1 arg2 arg3)
message(STATUS “this is arg1: a r g 1 , A R G V 0 = {arg1},ARGV0= arg1,ARGV0={ARGV0}”)
message(STATUS “this is arg2: a r g 2 , A R G V 1 = {arg2},ARGV1= arg2,ARGV1={ARGV1}”)
message(STATUS “this is arg3: a r g