定义一个名称为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

本文探讨了CMake中macro和function的区别,特别是ARGN、ARGV等参数的特殊性质。通过示例解释了ARGN、ARGV不是常规变量,而是字符串替换。文章还提供了一个导致混淆的示例,并分享了作者的Android开发经验与学习资源。
最低0.47元/天 解锁文章
-macro和function2,android高级面试2024&spm=1001.2101.3001.5002&articleId=137362358&d=1&t=3&u=c5ed6e67f93b4ddeb4eb7e7dcf5edcc8)
1112

被折叠的 条评论
为什么被折叠?



