cmake 添加宏_CMake 入门3 —— CMake 的函数和宏

本文详细介绍了CMake中function和macro的区别,强调了macro只做字符串替换,而function更像传统函数,支持参数值传递。此外,文章讨论了如何正确传递列表参数,以及在函数中处理额外参数的隐含变量。最后,提供了一个递归搜索子目录并添加到包含路径的示例函数。
摘要由CSDN通过智能技术生成

CMake 中 function 和 macro 的区别

通过代码直观地来看看区别。

set(var "ABC")

macro(Moo arg)

message("arg = ${arg}") # 输出原值 ABC

set(arg "abc")

message("# After change the value of arg.")

message("arg = ${arg}") # 输出原值 ABC

endmacro()

message("=== Call macro ===")

Moo(${var})

function(Foo arg)

message("arg = ${arg}") # 输出原值 ABC

set(arg "abc")

message("# After change the value of arg.") # 输出修改后的值 abc

message("arg = ${arg}")

endfunction()

message("=== Call function ===")

Foo(${var})

上面的例子来自 function-vs-macro-in-cmake。其中最佳答案的评论中还提到了一个非常有用的 cmake 参数 --trace-expand,该指令会将 cmake 中的宏定义展开,这样就方便了我们仔细研究 cmake 中的宏定义。

通过执行 cmake .. --trace-expand 我们可以知道以下事实:

关于 macro 宏定义的事实

1. 原代码的解析

在上面的例子中,宏定义 Moo 接受的参数其实是 var 的值,字符串 "ABC"。

在宏定义体中,需要引用参数的话,只能写 ${参数}。宏定义会将所有 ${参数} 的地方进行直接简单粗暴地替换为字符串"ABC"。

因此上面的代码中,当我们调用 Moo(${var}) 时,其实展开后的宏定义代码块变为了:

Moo(ABC)

message(arg = ABC)

set(arg abc)

message(# After change the value of arg.)

message(arg = ABC)

因此,宏定义中的 set 方法试图改变宏定义中传进来的参数 arg 是不可能的。set(arg "abc") 只是定义了一个变量 arg,且赋值为字符串 ‘abc’。

在 CMake 中,只要是不带空格的值,其本质上都是字符串。因此上面的 message(arg = ABC) 同 message(arg = "ABC") 是一样的。

2. 原代码的变形

如果我们将上面宏定义中的 set 方法修改为 set(${arg} "abc&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值