news 2026/5/15 18:55:41

C++扫盲系列|宏定义

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++扫盲系列|宏定义

最近看了下b站的GAS教程,发现了里面有一些源码看不懂,然后想着去熟悉一下,就发现了其中有个概念叫做宏。所以今天我们就花一点是时间来解读一下这个宏
参考文档:
https://www.runoob.com/cplusplus/cpp-preprocessor.html
【55】C++的宏_哔哩哔哩_bilibili这个大神关于宏的讲解非常的清晰,是一个值得一看的教程。

其实就是预处理,预处理的过程就是编译的前一步,在编译之前需要先做这一件事。这个过程能其实就是复制一些定义了的文件然后到这里。预处理呢一般是由#开头的,比如常见的这个#include。

介绍几个常见的宏

define 预处理

这个指令呢一般用于创建符号常量,统称为宏,指令的一般形式是#define macro-name replacement-text

条件编译

有一些指令呢可以选择性的对部分源码进行编译。这个过程就是条件编译

#ifdef NULL #define NULL 0 #endif

也可以在调试的时候进行编译比如,

#ifdef DEBUG cerr << "Variable x=" << x << endl; #endif
  • **宏的定义与预处理器关系

    00:04

    **:宏是利用 C++ 预处理器实现的功能,预处理器在编译前进行文本编辑,处理以哈希开头的预处理器指令,宏本质是代码中的文本替换,区别于模板(模板在编译阶段评估,宏在预处理器阶段纯文本替换)。

  • **宏的基础使用示例

    03:52

    **:通过定义#define WAIT std::cin.get,在代码中用WAIT;替代std::cin.get();,预处理器会在编译前将WAIT替换为std::cin.get;还举例定义#define OPEN_CURLY {,用其替代代码中的左花括号,强调此类简单替换无实际意义,不建议用于混淆代码。

  • **带参数宏的使用

    07:53

    **:定义#define LOG(x) std::cout << x << std::endl,在代码中用LOG("Hello");实现打印功能,预处理器会将LOG("Hello")替换为std::cout << "Hello" << std::endl,并提及该方式可用于简化日志打印,在复杂日志系统中有用。

  • **宏在调试与发布模式下的应用

    09:21

    **:在项目属性的 C/C++ 预处理器中定义PR_DEBUG(调试模式),通过#if defined(PR_DEBUG)定义LOG(x)为打印语句,#else定义LOG(x)为空,实现调试模式保留日志代码、发布模式删除日志代码,避免泄露信息且提升性能。

  • **宏定义的细节与技巧

    14:19

    **:建议将宏定义为带值形式(如#define PR_DEBUG 1),便于控制启用 / 禁用;可使用反斜杠\实现多行宏定义,如将主函数相关代码拆分行用反斜杠连接定义为宏,需注意反斜杠后无空格,否则会错误转义空格。

  • **宏的其他实用场景与后续内容提示

    16:03

    **:宏可用于调试时插入内置预处理器符号(如__FILE__获取文件路径、__LINE__获取代码行号),还可替换new关键字跟踪内存分配(如记录分配字节数、文件及行号);后续视频将深入宏的高级示例与特定应用场景,还提及 OpenGL 系列视频中有宏的实际应用案例(如包装 OpenGL 函数调用自动查错)。

  • **使用宏的注意事项

    02:57

    **:不建议过度使用宏,因其会增加代码理解难度,编写代码应追求清晰易懂,而非刻意使用多种 C++ 特性炫耀;定义宏时需注意分号位置(如不在宏定义末尾加分号,在代码调用时加,避免语法错误),且宏命名建议加项目前缀(如PR_),避免与其他宏冲突。

这里打算写一个系列的教程来帮助自己解决没次都想做完完美的这样一个性格,点个关注吧,后续会努力更新一些高质量文章并带一些实际的案例 ,respect

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 11:48:20

企业级在线互动学习网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着信息技术的快速发展和教育模式的数字化转型&#xff0c;企业级在线互动学习平台成为提升员工培训效率和知识管理的重要工具。传统线下培训模式受限于时间和空间&#xff0c;难以满足现代企业灵活、高效的学习需求。在线学习系统通过实时互动、个性化课程推荐和数据分…

作者头像 李华
网站建设 2026/5/15 1:28:12

SpringBoot+Vue 社区养老服务系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着人口老龄化问题日益加剧&#xff0c;社区养老服务需求快速增长&#xff0c;传统养老服务模式已无法满足高效化、信息化的管理需求。社区养老服务系统管理平台旨在通过数字化手段优化养老服务流程&#xff0c;提升服务效率和质量。该系统整合了老年人健康档案管理、服务…

作者头像 李华
网站建设 2026/5/14 10:30:49

本地 vs 云端部署:成本、隐私、延迟、运维复杂度怎么选?

传送锚点TL;DR&#xff08;给赶时间的读者&#xff09;1) 先把概念说清&#xff1a;本地、云端、混合各是什么&#xff1f;2) 成本对比&#xff1a;CAPEX vs OPEX&#xff0c;隐藏账单在哪里&#xff1f;2.1 本地成本&#xff08;On-Prem&#xff09;的真实构成2.2 云端成本&am…

作者头像 李华
网站建设 2026/5/9 22:19:36

RDF(Resource Description Framework) 入门理解

RDF入门理解 1. RDF简介 资源描述框架&#xff08;RDF&#xff09;是一个在 Web 中表示信息的框架。定义一个RDF数据模型用于链接所有基于RDF的语言和规范。抽象语法有两个关键的数据结构&#xff1a; RDF图是主谓宾三元组的集合&#xff0c;其中元素可以是 IRI、空白节点或数…

作者头像 李华
网站建设 2026/5/9 22:19:44

SpringBoot+Vue 小区团购管理管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展和社区经济的兴起&#xff0c;小区团购模式因其便捷性和高效性逐渐成为居民日常生活的重要组成部分。传统的线下团购模式存在信息传递不及时、管理效率低下等问题&#xff0c;难以满足现代居民对高效、透明购物体验的需求。基于此背景&#xff0c…

作者头像 李华
网站建设 2026/5/14 20:34:36

ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(八)

ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(八) 文章目录 ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(八) 模块A:移动应用界面设计 任务1:用户登录界面设计(7.5分) 任务2:健康首页界面设计(7.5分) 任务3:预约记录界面…

作者头像 李华