CMake入门教程【核心篇】宏模板(macro)

在这里插入图片描述

😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」点赞👍收藏⭐️评论📝


文章目录

    • 1. 定义宏
      • 1.1 基本语法
      • 1.2 示例
    • 2. 调用宏
      • 2.1 调用语法
      • 2.2 示例
    • 3. 参数传递
      • 3.1 示例
    • 4. 模拟宏的返回值
      • 4.1 示例
    • 5. 宏的作用域
      • 5.1 示例
    • 6.macro使用技巧
    • 结论

在本文中,我们将深入探讨CMake中宏的使用方法及其技巧,以简化CMakeLists.txt文件的编写和维护。

1. 定义宏

在CMake中,使用macro关键字定义宏。宏可以包含一系列的CMake指令,用于执行重复的任务。

1.1 基本语法

macro(<macro_name> [arg1 [arg2 ...]])# 宏的内容
endmacro()

1.2 示例

定义一个名为print_message的宏,用于打印一条消息:

macro(print_message message)message(STATUS "Message: ${message}")
endmacro()

2. 调用宏

调用宏时,使用宏的名称并传入相应的参数。

2.1 调用语法

在CMake中,调用宏的语法如下:

<macro_name>([arg1 [arg2 ...]])

2.2 示例

调用print_message宏:

print_message("Hello, CMake!")

3. 参数传递

宏支持参数传递。在宏定义时指定参数名,在调用时传递相应的实际参数值。

3.1 示例

定义一个名为print_sum的宏,计算两个数的和:

macro(print_sum a b)math(EXPR sum "${a} + ${b}")message(STATUS "Sum: ${sum}")
endmacro()

调用print_sum宏:

print_sum(3 5)

4. 模拟宏的返回值

虽然CMake宏没有返回值的概念,但可以通过设置变量来模拟返回值。

4.1 示例

定义add_numbers宏,计算两个数的和,并将结果保存在变量中:

macro(add_numbers a b result_var)math(EXPR sum "${a} + ${b}")set(${result_var} ${sum} PARENT_SCOPE)
endmacro()

调用add_numbers宏:

set(my_result)
add_numbers(3 5 my_result)
message(STATUS "Result: ${my_result}")

5. 宏的作用域

宏内部定义的变量默认是局部的。使用PARENT_SCOPE选项可以将变量提升到父级作用域。

5.1 示例

定义set_global_variable宏,设置一个全局变量:

macro(set_global_variable var_name var_value)set(${var_name} ${var_value} PARENT_SCOPE)
endmacro()

调用set_global_variable宏:

set_global_variable(my_var "Hello, CMake!")
message(STATUS "Global variable: ${my_var}")

6.macro使用技巧

定义
调用
作用域管理
与函数比较
复用宏
参数处理
macro(name args)
name(values)
宏内变量
宏无独立作用域
封装常用逻辑
可变参数列表
宏的使用
宏的定义
宏的调用
变量作用域
宏与函数的区别
宏的复用
参数处理
逻辑实现
执行宏逻辑
set(variable value PARENT_SCOPE)
函数有独立作用域
简化脚本
使用ARGN

结论

CMake宏是一种强大的工具,可以有效地简化和重用CMake代码。通过理解宏的基本用法、参数传递、返回值模拟以及作用域管理,你可以提高CMakeLists.txt文件的可维护性和可读性。正确使用宏将有助于提高项目构建过程的效率和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找(一)

算法原理 原理&#xff1a;当一个序列有“二段性”的时候&#xff0c;就可以使用二分查找算法。 适用范围&#xff1a;根据规律找一个点&#xff0c;能将这个数组分成两部分&#xff0c;根据规律能有选择性的舍去一部分&#xff0c;进而在另一个部分继续查找。 除了最普通的…

Ps:创建基于颜色的蒙版

有时候画面上的某种颜色显得不是很和谐&#xff0c;如下图所示。 将画面上的某种颜色换掉&#xff0c;也是得到创意效果的一种重要手段。 演示视频 如果能创建好相关颜色的蒙版&#xff0c;这样在替换颜色的时候就会更加方便。 ◆ ◆ ◆ 创建基于颜色的蒙版 主要思路&#xf…

最大公约数算法

最大公约数算法&#xff1a; 以下代码用于实现最大公约数算法&#xff1a; 实例(Python 3.0) # Filename : test.py # author by : www.dida100.com # 定义一个函数 def hcf(x, y): """该函数返回两个数的最大公约数""" # 获取最小…

【动态规划】C++算法:44 通配符匹配

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 LeetCode44 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 &#xff0c;请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配&#xff1a; ‘?’ 可以匹配任何单个字符。 ’ 可以匹配…

122基于matlab的CSO-SVM,BA-SVM模式识别模型

基于matlab的CSO-SVM&#xff0c;BA-SVM模式识别模型。优化SVM的两个参数晚上最佳参数确定。输出分类识别结果和准确率。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 122鸡群优化算法蝙蝠优化算法 (xiaohongshu.com)

Unity | Shader基础知识番外(向量数学知识速成)

目录 一、向量定义 二、计算向量 三、向量的加法&#xff08;连续行走&#xff09; 四、向量的长度 五、单位向量 六、向量的点积 1 计算 2 作用 七、向量的叉乘 1 承上启下 2 叉乘结论 3 叉乘的计算&#xff08;这里看不懂就百度叉乘计算&#xff09; 八、欢迎收…

78 Python开发-多线程FuzzWaf异或免杀爆破

这里写目录标题 本课知识点:学习目的:演示案例:Python开发-简单多线程技术实现脚本Python开发-利用FTP模块实现协议爆破脚本Python开发-配合Fuzz实现免杀异或Shell脚本 涉及资源: 本课知识点: 协议模块使用&#xff0c;Request爬虫技术&#xff0c;简易多线程技术&#xff0c;…

探索模块化神经网络在现代人工智能中的功效和应用

一、介绍 在快速发展的人工智能领域&#xff0c;模块化神经网络 (MNN) 已成为一项关键创新。与遵循整体方法的传统神经网络架构不同&#xff0c;MNN 采用分散式结构。本文深入探讨了 MNN 的基础知识、它们的优势、应用以及它们带来的挑战。 evertongomede 在人工智能领域&#…

MySQL5.7无法连接到[本地] MySQL 服务器

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: B.3.2.2 Cant connect to [local] MySQL server 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 5.7 参考手册 / ... / 无法连接到[本地] …

Linux dip命令教程:如何使用dip命令进行IP拨号连接(附实例教程和注意事项)

Linux dip命令介绍 dip命令&#xff0c;全称为Dialup IP&#xff0c;是用于IP拨号连接的命令。它可以控制调制解调器&#xff0c;以拨号IP的方式建立对外的双向连接。这个命令可以用于自动化一些步骤&#xff0c;比如打开串行设备&#xff0c;使调制解调器拨号到提供商&#x…

通灵术揭秘:空碗“竖筷子”不倒

通灵术揭秘&#xff1a;空碗“竖筷子”不倒 释名&#xff1a;竖筷子是流传很广的一种民间小术&#xff0c;因其法是在碗中竖起一支或三支筷子&#xff0c;故名。 用处&#xff1a;如果有人莫名其妙的生病了&#xff0c;医药无效&#xff0c;按民间的说法&#xff0c;就是遇鬼了…

苹果cmsV10暗黑大气MT主题模板源码-只有PC版本

苹果cms MT主题是一款多功能苹果cmsV10暗黑大气主题 初次使用说明&#xff1a; 网站模板选择mt 模板目录填写html 后台地址&#xff1a;MT主题,mt/mtset 先应用主题打开前台&#xff0c;再点击后台。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725…

Python武器库开发-武器库篇之代理池配置(四十)

武器库篇之代理池配置(四十) 我们在渗透的过程中&#xff0c;是必须要挂代理的&#xff0c;相信为何要挂代理的原因&#xff0c;各位也是非常的明白的&#xff0c;这里就不多讲了。关于如何挂代理和购买代理大家可以去看内网隧道代理技术&#xff08;十&#xff09;之公网资产…

GitHub上的15000个Go模块存储库易受劫持攻击

内容概要&#xff1a; 目前研究发现&#xff0c;GitHub上超过15000个Go模块存储库容易受到一种名为“重新劫持”的攻击。 由于GitHub用户名的更改会造成9000多个存储库容易被重新劫持&#xff0c;同时因为帐户删除&#xff0c;会对6000多个存储库造成重新劫持的危机。目前统计…

华芯微特|MCU之TIMER输入捕获

引言 华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别&#xff0c;为了让您更加简单的使用这一功能&#xff0c;下面小编将以SWM190为例&#xff0c;我们今天详细讲解一下TIMER的输入捕获功能。 TIMER输入捕获 一、TIMER定时器之输入捕获功能 我们今天详细讲解一下…

uwsgitop 使用

背景&#xff1a;Django项目 uwsgi&#xff0c;uwsgi.ini 在工程下。 使用&#xff1a; 下载安装uwsgitop [roothost ~]# tar -zxvf uwsgitop-0.11.tar.gz [rootuwsgitop-0.11 ~]# cd uwsgitop-0.11/ [rootuwsgitop-0.11 ~]# python setup.py install [rootuwsgitop-0.11 …

产品|燕窝中的“秘密武器”——燕窝酸

前言 当提及燕窝&#xff0c;大部分人脑海中首先会闪过的大概是“宫廷圣品”、“名贵补品”等听上去十分高大上的形容词。然而随着现代人们生活水平的提高&#xff0c;燕窝已不再神秘&#xff0c;逐渐成为寻常百姓餐桌上的常见食品之一。据我国中医记载&#xff0c;燕窝具有养…

【注解】@FeignClient 用于微服务通信

FeignClient 是 Spring Cloud 中用于声明和创建 Feign 客户端的注解。Feign 是一种声明式的、模板化的 HTTP 客户端&#xff0c;它简化了使用 Spring Cloud Ribbon 的 REST 客户端的开发。 下面是一个简单的使用示例&#xff1a; import org.springframework.cloud.openfeign…

项目框架构建之2:主机程序的搭建

本文是“项目框架构建”系列之2&#xff0c;要编写一个项目框架&#xff0c;就好像一个操作系统似的&#xff0c;得有一些东西可以搭载项目结构&#xff0c;而.net core的主机框架正是可以实现这一目的的好帮手。 简单介绍一下主机程序&#xff0c;我们生产系统中往往需要构建…

Shape-IoU:考虑边框形状与尺度的度量

Abstract https://arxiv.org/pdf/2312.17663.pdf 作为检测器定位分支的重要组成部分&#xff0c;边界框回归损失在目标检测任务中发挥着重要作用。现有的边界框回归方法通常考虑真实框&#xff08;GT box&#xff09;与预测框之间的几何关系&#xff0c;并使用边界框的相对位置…