C++学习笔记 23 宏 Macro

一、什么是宏

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

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

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

二、宏的真实使用案例

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

#define WAIT std::cin.get()
#define LEFT_CURLY {
#define Log(x) std::cout << x << std::endl;

void testMacro01() {
	WAIT;
}

void testMacro02() LEFT_CURLY
	std::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)
#endif

void 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)
#endif

void 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模式下的宏参数

release模式下的宏参数

debug模式下,宏参数给值

相关推荐
汉克老师4 分钟前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂1 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven1 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus12 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla14 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu19 小时前
一个通用游戏数据服务器
c++·架构
another heaven19 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论