当前位置: 首页 > news >正文

C++学习笔记 23 宏 Macro

一、什么是宏

     预处理器会过一遍C++所有你看到的语句,以#开头:这是 预编译指令符号。当与编译器评估完代码之后,会把评估后的代码给到编译器进行实际的编译以及其它操作。所以,预处理阶段基本上就是一个文本处理阶段,在这个阶段,我们可以控制什么代码会喂给编译器。这就是宏的作用。我们能做的就是写一些宏,它将代码中的文本替换为其他东西。基本上就像遍历代码,查找并替换。不一定是简单的直接进行查找和替换,可以是以形参、实参、变量的方式查找替换。

     模板和宏不一样,在实际的编译过程中,模板会评估的更晚些,运行期动态替换。而宏的处理是在预处理器处理阶段,是纯文本替换。没有什么东西是不能被替换的,因为是在编译之前。

     我想要强调的是,你可以在此阶段做很多事情,你使用宏的方式,可以非常很简单,可以非常复杂,可以非常很麻烦,还可以非常有用。

二、宏的真实使用案例

  1. 记录错误日志:openGL方法调用,使用宏进行包装,进行自动错误检查
  2. 内存跟踪debug:在debug构建中,我们可能想知道,多少字节被分配了,从哪个cpp问和哪行代码,比如main.cpp的第15行分配了28字节,为了跟踪和调试的目的。你可以使用宏做这些,可以把new 关键字替换为一个自定义的单词,它会自动跟踪,并日志记录是从哪个文件的哪一样,分配了多少内存。

#include<iostream>#define WAIT std::cin.get()
#define LEFT_CURLY {
#define Log(x) std::cout << x << std::endl;void testMacro01() {WAIT;
}void testMacro02() LEFT_CURLYstd::cout << "Hello" << std::endl;
}void testMacro03() {Log("Hello World");
}//#ifdef让日志语句只在debug模式下打印,而release不打印
#ifdef PR_DEBUG#define LOG(x) std::cout << x << std::endl;
#else#define LOG(x)
#endifvoid testMacro04() {LOG("world hello 1");
}//0 代表false,可以利用预处理器和宏 来删除特定代码
#if 0//#if 参数判断
#if PR_DEBUG == 1#define LOG(x) std::cout << x << std::endl;
#elif defined(PR_RELEASE)#define LOG(x)
#endifvoid testMacro05() {LOG("world hello 2");
}#endif
//end of #if 0//用反斜杠代表换行,自定义main函数的宏, 
#define MAIN int main() \
{\std::cout << "hello main" << std::endl;\std::cin.get();\
}//使用MAIN函数的宏
MAIN/*int main() {testMacro01();testMacro02();testMacro03();testMacro04();//testMacro05();
}*/

debug模式下的宏参数
pr_debug

release模式下的宏参数
pr_release

debug模式下,宏参数给值
pr_debug=1赋值

http://www.jsqmd.com/news/110928/

相关文章:

  • FireFox 配置
  • 2025年12月医用电梯安装,观光电梯安装,家用电梯安装公司推荐:行业测评与选择指南 - 品牌鉴赏师
  • 2025年12月发膜品牌推荐榜:8秒液体/蛋白/修护/发膜,玛丝兰领衔修护新标杆,从发芯强韧开始,让枯发重获新生 - 海棠依旧大
  • 2025年12月洁净无氧烘箱厂家新标杆:德菲瑞斯高真空无氧烘箱、HMDS 无氧烘箱、真空无氧烘箱、充氮无氧烘箱、高温无氧烘箱、HMDS真空无氧烘箱、精准控温更可靠 - 海棠依旧大
  • Row下的两个Text文本自适应宽度,并以中间为基准滚动
  • Vite:现代前端构建工具的革命与实战指南
  • 立体相机标定
  • 2025年12月专业的株洲搬家公司实力榜:株洲家庭搬家、株洲厂房搬迁、株洲钢琴搬运、五家企业凭服务与口碑出圈 - 海棠依旧大
  • ABAP调用CDS AMDP:数据库存储过程封装
  • 专业解读|北京刑事律师事务所实力排名:2025靠谱机构辩护方案对比 - 老周说教育
  • 2025年12月株洲靠谱的搬家公司首选:株洲旺成搬家,株洲搬迁公司、株洲企业搬迁、株洲长途搬家、株洲居民搬家、专业团队护航全程无忧 - 海棠依旧大
  • 2025年煤粉仓防爆门实力厂家权威推荐榜单:重力防爆门/矩形防爆门/弹簧防爆门源头厂家精选 - 品牌推荐官
  • 网络工程毕设2026开题指导
  • 2025年12月楼梯/实木楼梯/实木衣柜门品牌推荐榜单精选 - 2025年品牌推荐榜
  • 2025年12月内蒙古呼和浩特驾校/摩托车驾校推荐榜单 - 2025年品牌推荐榜
  • 半导体测试之静态测试参数有哪些?为什么要进行测试?
  • 5分钟搞定AI字幕生成:ComfyUI终极配置完整指南 [特殊字符]
  • 2025年四机头数控钢筋弯曲中心供应商权威推荐榜单:钢筋智能弯曲中心/自动钢筋弯曲/数控式钢筋弯曲中心源头厂家精选 - 品牌推荐官
  • 极速组态!Profinet转Ethernet网关让ABB机器人主站秒连工业网络(下集)
  • Sketch 2025.3文件夹管理更新解析:支持无限嵌套与灵活组织
  • CentOS 7+ 安装 GreatSQL 8.0.32-26
  • Amazon EC2 实例类型命名约定
  • 实用参考!2025-2026北京律师事务所排行榜:全维度服务能力解析 - 老周说教育
  • P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
  • 2025年耐气候老化性管材制造企业权威推荐榜单:PVDF管材/耐腐蚀性管材/耐热性管材制造企业精选 - 品牌推荐官
  • 低速离心机2025年市场调研与优质源头厂家(知名企业)推荐 - 品牌推荐大师1
  • Omnissa Horizon 8 2512 发布 - 虚拟桌面基础架构 (VDI) 和应用软件
  • 极速组态!Profinet转Ethernet网关让ABB机器人主站秒连工业网络(上集)
  • 精通Java LaTeX渲染:JLaTeXMath实战应用全解析
  • 期末复习:结构算法题