有关 c++ 中宏的定义以及使用是今天的重点内容。
C++ 的宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。
其实宏就是在源码在编译前一个预处理指令,将代码中指定宏命令找到并以文本的形式进行替换而已。
宏命令可以减少开发者的工作,但是个人并不推荐过渡地使用宏,这样降低了代码的可读性。
#include <iostream>
#include <string>
#define WAIT std::cin.get()
int main(int argc, char const *argv[])
{
WAIT;
}
是通过#define
定义宏的,这里WAIT
等同于std::cin.get()
,在预处理阶段会将WAIT
替换为std::cin.get()
后再进行编译。
大家可能注意到后门面的;````。因为定义
WAIT的代码段包含
;。所以我们需要在
WAIT```后面补充上;
。这表明这是一种纯文本的替换。
#define WAIT std::cin.get();
int main(int argc, char const *argv[])
{
WAIT
}
下面例子中我们用OPEN_CURY
表示{
。
#include <iostream>
#include <string>
#define OPEN_CURY {
int main(int argc, char const *argv[])
OPEN_CURY
std::cin.get();
}
以上的例子并不会出现在实际开发中,也没有什么具体意义仅是为了说明宏的使用方法,以及宏是如何工作的而已。
#define LOG(x) std::cout << x << std::endl
int main(int argc, char const *argv[])
{
LOG("hello");
std::cin.get();
}
通过我们会控制输出作为一个宏来使用,这样可以简化我们一些控制输出代码。
#include <iostream>
#include <string>
#define MAIN \
int main() \
{ \
std::cin.get(); \
}
MAIN
我们通常在开发调试阶段需要输出一些信息供监控程序运行状况,而在实际发布到生成环境时候处于一些安全问题我们可能需要去掉这些输出,这个时候我们就会用到宏进行实现
#include <iostream>
#include <string>
#ifdef PR_DEBUG
#define LOG(x) std::cout << x << std::endl
#else
#define LOG(x)
#endif
int main(int argc, char const *argv[])
{
LOG("hello");
std::cin.get();
}
- 如果存在
PR_DEBUG
就将LOG(x)
定义为std::cout << x << std::endl
进行输出。否则定义为空不进行任何输出。
g++ macro1.cpp -D PR_DEBUG -o marco1
我们可以通过-D PR_DEBUG
定义宏
#if PR_DEBUG == 1
#define LOG(x) std::cout << x << std::endl
#else
#define LOG(x)
#endif
可以通过给自定义宏PR_DEBUG
传递参数来控制流程。
g++ macro1.cpp -D PR_DEBUG=1 -o marco1
网友评论