C++中宏的使用方法
程序代码如下
#include <iostream>
#ifdef PR_DEBUG
#define LOG(x) \
std::cout << (x) <<std::endl
#else
#define LOG(x)
#endif
#define num 10
#include <deque>
#define zsize(z) int64_t((z).size())
int main()
{
LOG("hello");
#if num
std::cout << "第一部分" << std::endl;
#else
std::cout << "第二部分" << std::endl;
#endif
std::deque <int> q;
q.push_back(123);
//下面语句输出为1,因为C++中无符号和有符号比较时,有符号会自动转换成无符号,
// 所以-1会变成一个很大的正数
std::cout << (-1 > q.size()) << std::endl;
//下面语句输出为0,因为在宏里面对其已经进行过强制转换了。
std::cout << (-1 >zsize(q)) << std::endl;
return 0;
}
代码段一:
#ifdef PR_DEBUG
#define LOG(x) \
std::cout << (x) <<std::endl
#else
#define LOG(x)
#endif
上面这段代码中实现了在DEBUG模式下使用LOG输出日志,RELEASE模式下不输出日志。
因为宏定义的时候后面的代码要放在一行,所以上面使用了\将其连接起来,注意\后面不要添加空格。
然后如果定义了PR_DEBUG则执行LOG后面的std::cout,如果没有定义则执行LOG后面没有输出内容,所以在发布软件时,只要去掉PR_DEBUG的定义就实现了内容的关闭输出。
代码段二:
#define num 10
#if num
std::cout << "第一部分" << std::endl;
#else
std::cout << "第二部分" << std::endl;
#endif
分析:宏定义是预处理器指令的一种,通常在编译之前由预处理器执行。
所以上面使用#if进行判断时,num要在前面使用宏定义初始化,如果直接使用代码初始化会导致使用这个num在初始化这个num之前。
代码段三:
#define zsize(z) int64_t((z).size())
std::deque <int> q;
q.push_back(123);
//下面语句输出为1,因为C++中无符号和有符号比较时,有符号会自动转换成无符号,
// 所以-1会变成一个很大的正数
std::cout << (-1 > q.size()) << std::endl;
//下面语句输出为0,因为在宏里面对其已经进行过强制转换了。
std::cout << (-1 >zsize(q)) << std::endl;
因为size()函数返回的是一个无符号整型,当无符号的和有符号的比较时,有符号的会转换成无符号的,比如这里-1转换为补码形式,即最大值。所以为了避免自己代码中出现这种问题,可以通过宏的方式在宏里面将无符号整型的size()强制转换为有符号的。
这一块观看的哔哩哔哩🔗C++中的宏【入门】_哔哩哔哩_bilibili,(感谢UP的创作,已三连)
还有一点补充,就是宏定义里面的传参,参考代码段1