news 2026/5/1 7:18:31

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/4/18 17:00:15

Flutter for OpenHarmony Python学习助手实战:函数定义与高级用法的实现

函数是代码复用的基础&#xff0c;掌握函数设计是成为优秀程序员的关键。在开发Python学习助手的过程中&#xff0c;我深刻体会到如何用Flutter为学习者打造一个优秀的函数定义与高级用法功能是多么重要。今天我来分享一下具体的实现思路和技术细节。 函数学习的核心挑战 在我多…

作者头像 李华
网站建设 2026/4/23 17:47:16

ZZ039 移动应用与开发赛项参考答案专栏必看说明

本专栏为ZZ039 移动应用与开发赛项参考答案。 内容全程涵盖国赛与省赛所有题目内容&#xff1a;模块A&#xff1a;移动应用界面设计、模块B&#xff1a;移动应用前端开发、模块C&#xff1a;移动应用测试与交付。 专栏后期会陆续更新各模块的答案&#xff0c;订阅专栏后您可永久…

作者头像 李华
网站建设 2026/4/8 14:37:29

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

ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(六) 文章目录 ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(六) 模块A:移动应用界面设计 任务1:环保中心界面设计(7.5分) 任务2:首页界面设计(7.5分) 任务3:积分捐献活动界面…

作者头像 李华
网站建设 2026/5/1 7:04:24

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

ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(九) 文章目录 ZZ039移动应用与开发赛项模块A—移动应用界面设计原型图XD参考答案(九) 模块A:移动应用界面设计 任务1:实现用户登录界面(7.5分) 任务2:实现主界面(7.5分) 任务3:实现民宿列表界面(…

作者头像 李华