[③CMake]: 函数(function)和宏(macro)的使用

本文介绍了CMake中function和macro命令的区别,如参数传递方式和作用域,以及如何提高代码可读性和重用性。还提到如何使用macro创建布尔型缓存变量和使用function进行数学计算的示例。
摘要由CSDN通过智能技术生成

前言

在CMake中,为了更好体现CMakeLists.txt文件中代码的可读性和重复利用,我们可以使用function命令和macro命令。function和macro命令非常类似,但是也有不同,比如参数传递的方式,在function中,参数传递采用传值的方式,类似C语言,而在macro中,参数传递采用文本替换的方式。调用macro时,相当于把macro中的语句替换到相应的位置,即macro的作用域是全局的,是整个CMakeLists.txt文件,所以在macro中要避免使用return()命令,因为如果在macro中执行return(),整个CMake进程就会退出,与之对应的function的作用域是局部的。另外macro命令不会影响CMake下面这些环境变量:CMAKE_CURRENT_FUNCTION, CMAKE_CURRENT_FUNCTION_LIST_DIR, CMAKE_CURRENT_FUNCTION_LIST_FILE, CMAKE_CURRENT_FUNCTION_LIST_LINE。
如果为了更好体现文件的调用结构,我们可以把function和marco分别写到functions.cmake和macros.cmake文件中,然后在CMakeLists.txt文件使用include命令将function和marco引用进来:

include("functions.cmake")
include("macros.cmake")

macro

macro命令的基本语法是:

macro(<name> [<arg1> ...])
  <commands>
endmacro()

下面一个macro样例是添加一个布尔类型的缓存变量,当为True时,格外添加个定义。参数传递使用${arg}:

macro(add_boolean_option name val helpstr)
  if(DEFINED ${name})
    set(value ${${name}})
  else(DEFINED ${name})
    set(value ${val})
  endif()
  set(${name} ${value} CACHE STRING "${helpstr}")
  set_property(CACHE ${name} PROPERTY TYPE BOOL)
  if (${value})
    add_definitions("-D${name}")
  endif (${value})
endmacro(add_boolean_option)

调用这个marco可以比如写:

add_boolean_option(BOOST False "if enabling BOOST")

function

function命令的基本语法是:

function(<name> [<arg1> ...])
  <commands>
endfunction()

下面是function一个求和的样例,val0,val1作为输入,sum作为输出:

function(func_sum val0 val1 sum)
  math(EXPR res "${val0} + ${val1}")
  set(${sum} ${res} PARENT_SCOPE)
endfunction()

调用这个function可以比如写:

func_sum(1 2 SUM)
message(STATUS "SUM = ${SUM}")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李71~李先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值