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

news2024/11/16 15:34:28

在这里插入图片描述

😈「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.coloradmin.cn/o/1352787.html

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

相关文章

红日靶场-3

目录 前言 外网渗透 外网渗透打点 1、arp 2、nmap 3、nikto 4、whatweb 5、gobuster 6、dirsearch CMS 1、主页内容 2、/configuration.php~ 目录 3、/administrator 目录 4、Joomla!_version探测 5、joomlascan python脚本 6、joomscan perl脚本 MySQL 1、远…

bootstrap5实现通用果蔬网站 FoodMart页面模板

一、需求分析 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起&#xff0c;为消费者提供方便、快捷的购物渠道。通用果蔬网站的作用主要包括以下几个方面&#xff1a; 商品展示和销售&#xff1a;通用果蔬网…

[DevOps-01] DevOps介绍

一、简要描述 DevOps&#xff1a;Development & Operations的缩写&#xff0c;也就是开发&运维 DevOps是一个不断提高效率并且持续不断工作的过程。 核心&#xff1a;简化Dev和Ops团队之间的流程&#xff0c;使整体软件开发过程更快速。 DevOps定义&#xff1a; DevOps…

4462 4.曙曙献爱心

#include<bits/stdc.h> using namespace std; int n,m,k; int a[1001]; int s[1001]; int f[1001][1001];//f[i][j]&#xff0c;i个警察&#xff0c;j个点&#xff0c;能管理的最大人数 int main(){cin>>n>>m>>k;for(int i1;i<n;i){cin>>a[i…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何&#xff1f; 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…

什么是Maven ??? (以及关于依赖,中央仓库,国内源)

文章目录 什么是 Maven创建第一个 Maven 项目依赖管理Maven 的仓库Maven 如何设置国内源 什么是 Maven Maven &#xff1a;用于构建和管理任何基于java的项目的工具。**说白了就是管理 Java项目 的工具。**我们希望我们已经创建了一些东西&#xff0c;可以使Java开发人员的日常…

大一C语言基础知识点圈画1(结构体,共用体指针,数组字符串)

是所有成员占内存的总和吗&#xff1f; 不是&#xff0c; 非所有成员变量的内存总和

机器学习常用算法模型总结

文章目录 1.基础篇&#xff1a;了解机器学习1.1 什么是机器学习1.2 机器学习的场景1.2.1 模式识别1.2.2 数据挖掘1.2.3 统计学习1.2.4 自然语言处理1.2.5 计算机视觉1.2.6 语音识别 1.3 机器学习与深度学习1.4 机器学习和人工智能1.5 机器学习的数学基础特征值和特征向量的定义…

视频剪辑方法:掌握视频嵌套合并技术,释放无限创意

随着数字媒体的普及&#xff0c;视频剪辑已是创意表达的重要技巧。通过掌握视频嵌套合并技术&#xff0c;可以将多个视频片段融合在一起&#xff0c;创造出独特的视觉效果和故事叙述。现在一起看云炫AI智剪批量剪辑视频嵌套合并方法&#xff0c;释放无限创意。 准备视频素材&a…

知识库:提升客服效率的利器

相信大家都有过这样的经历&#xff1a;在需要帮助或解决问题时&#xff0c;与客服沟通却遇到了冗长的等待时间、低效的回答和重复的解决方案。这些问题不仅令人沮丧&#xff0c;也给企业带来了巨大的挑战。然而&#xff0c;随着技术的发展&#xff0c;客服系统中的知识库正逐渐…

sqlserver根据分组的内容分别查询出匹配的一条信息

需求场景&#xff1a; 我写了条分组语句&#xff0c; select name from car_machine_command group by name 然后该表有很多条相关的数据&#xff0c;我只想拿各个分组的一条数据看看即可 解决&#xff1a;可以使用窗口函数&#xff08;Window Function&#xff09;和 ROW_NU…

电磁波的信号加载说明

电磁波的信号加载电磁波(Electromagnetic wave)是由同相振荡 且互相垂直的电场与磁场在空间中衍生发射的振荡粒子波&#xff0c;是以波动的形式传播的电磁场&#xff0c;具有波粒二象性&#xff0c;其粒子形态称为光子&#xff0c;电磁波与光子不是非黑即白的关系&#xff0c;而…

【算法系列 | 11】深入解析查找算法之—插值查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第11讲&#xff0c;讲…

kbdnso.dll文件缺失,软件或游戏报错的快速修复方法

很多小伙伴遇到电脑报错&#xff0c;提示“kbdnso.dll文件缺失&#xff0c;程序无法启动执行”时&#xff0c;不知道应该怎样处理&#xff0c;还以为是程序出现了问题&#xff0c;想卸载重装。 首先&#xff0c;先要了解“kbdnso.dll文件”是什么&#xff1f; kbdnso.dll是Win…

拒绝纸张浪费,Paperless-ngx开源文档管理系统将纸质版转换成可搜索的电子版档案

GitHub&#xff1a;GitHub - paperless-ngx/paperless-ngx: A community-supported supercharged version of paperless: scan, index and archive all your physical documents 在线演示&#xff1a;https://demo.paperless-ngx.com 官网&#xff1a;https://docs.paperless-n…

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…

关于“Python”的核心知识点整理大全58

目录 19.2.3 注销 1. 注销URL urls.py 2. 视图函数logout_view() views.py 3. 链接到注销视图 base.html 19.2.4 注册页面 1. 注册页面的URL模式 urls.py 2. 视图函数register() views.py 3. 注册模板 register.html 4. 链接到注册页面 base.html 注意 19.3 …

[Unity]实时阴影技术方案总结

一&#xff0c;Planar Shadow 原理就是将模型压扁之后绘制在需要接受阴影的物体上&#xff0c;这种方式十分高效&#xff0c;消耗很低。具体实现过程参考Unity Shader - Planar Shadow - 平面阴影。具按照自己的理解&#xff0c;其实就是根据光照方向计算片元在接受阴影的平面…

【备忘】今天写一下如何买免费证书

使用场景 使用微信支付宝支付转账时小游戏小程序接口开发时其它情况 开发中不可避免的会接触https&#xff0c;有的公司有运维去做这个事&#xff0c;有的是老板自己会搞https证书&#xff0c;咱多了解一项技术也是好事。 如何买证书 登录阿里云控制台&#xff0c;搜索ssl证…

Jenkins部署项目

一.安装jenkins 1.1进入jenkins官网下载jenkins war包&#xff0c;上传到服务器/usr/local目录。 1.2执行启动jenkins命令&#xff0c;&#xff08;注意jenkins版本需要的jdk版本&#xff09; /usr/local/java11/bin/java -Djava.awt.headlesstrue -jar /usr/local/jenkins.wa…