定义一个名称为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
3
,
A
R
G
V
2
=
{arg3},ARGV2=
arg3,ARGV2={ARGV2}”)
message(STATUS "this is argc:
A
R
G
C
"
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
t
h
i
s
i
s
a
r
g
s
:
{ARGC}") message(STATUS "this is args:
ARGC")message(STATUS"thisisargs:{ARGV},ARGN=
A
R
G
N
"
)
i
f
(
a
r
g
1
S
T
R
E
Q
U
A
L
o
n
e
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
t
h
i
s
i
s
a
r
g
1
"
)
e
n
d
i
f
(
)
i
f
(
A
R
G
V
2
S
T
R
E
Q
U
A
L
"
t
w
o
"
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
t
h
i
s
i
s
a
r
g
2
"
)
e
n
d
i
f
(
)
s
e
t
(
{ARGN}") if(arg1 STREQUAL one) message(STATUS "this is arg1") endif() if(ARGV2 STREQUAL "two") message(STATUS "this is arg2") endif() set(
ARGN")if(arg1STREQUALone)message(STATUS"thisisarg1")endif()if(ARGV2STREQUAL"two")message(STATUS"thisisarg2")endif()set({arg1} nine)
message(STATUS “after set arg1=KaTeX parse error: Expected '}', got 'EOF' at end of input: {{arg1}}”)
endmacro(FOO)
function(BAR arg1)
message(STATUS “this is arg1:
a
r
g
1
,
A
R
G
V
0
=
{arg1},ARGV0=
arg1,ARGV0={ARGV0}”)
message(STATUS “this is argn:
A
R
G
N
"
)
i
f
(
a
r
g
1
S
T
R
E
Q
U
A
L
f
i
r
s
t
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
t
h
i
s
i
s
f
i
r
s
t
"
)
e
n
d
i
f
(
)
s
e
t
(
a
r
g
1
t
e
n
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
a
f
t
e
r
s
e
t
a
r
g
1
=
{ARGN}") if(arg1 STREQUAL first) message(STATUS "this is first") endif() set(arg1 ten) message(STATUS "after set arg1=
ARGN")if(arg1STREQUALfirst)message(STATUS"thisisfirst")endif()set(arg1ten)message(STATUS"aftersetarg1={arg1}”)
endfunction(BAR arg1)
set(p1 one)
set(p2 two)
set(p3 three)
set(p4 four)
set(p5 five)
set(p6 first)
set(p7 second)
FOO(${p1} ${p2} ${p3} ${p4} p 5 ) B A R ( {p5}) BAR( p5)BAR({p6} p 7 ) m e s s a g e ( S T A T U S " a f t e r b a r p 6 = {p7}) message(STATUS "after bar p6= p7)message(STATUS"afterbarp6={p6}")
输出结果如下:
– this is arg1:one,ARGV0=one
– this is arg2:two,ARGV1=two
– this is arg3:three,ARGV2=three
– this is argc:5
– this is args:one;two;three;four;five,ARGN=four;five
– after set arg1=nine
– this is arg1:first,ARGV0=first
– this is argn:second
– this is first
– after set arg1=ten
– after bar p6=first
接下来看一个让我们蛋都能疼碎了的例子,简直不想用cmake:
macro(_bar)
foreach(arg IN LISTS ARGN)
message(STATUS “this is in macro ${arg}”)
endforeach()
endmacro()
function(_foo)
foreach(arg IN LISTS ARGN)
message(STATUS “this in function is ${arg}”)
endforeach()
_bar(x y z)
endfunction()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的
还有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
nux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**