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

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


http://www.kler.cn/a/461004.html

相关文章:

  • Oracle exp和imp命令导出导入dmp文件
  • 黑马JavaWeb开发跟学(十四).SpringBootWeb原理
  • 解決當前IP地址僅適用於本地網路
  • 小程序学习07—— uniapp组件通信props和$emit和插槽语法
  • kubelet状态错误报错
  • 【VBA】EXCEL - VBA 遍历工作表的 5 种方法,以及注意事项
  • AI同传的崛起:人工同传还能坚持多久?
  • 股市学习 seekingalpha tradingview
  • OpenAI 的 o3 — AGI 还是闪亮的幻影?
  • 信息安全管理:网络安全
  • iPhone 14、iPhone SE 3,提前淘汰
  • 深度学习-稀疏卷积
  • SD-WAN与传统专线网络的区别分析
  • Codigger集成Copilot:智能编程助手
  • 【2024年-7月-27日-开源社区openEuler实践记录】剖析 elease - management:优化软件发布流程的开源方案
  • 七次课掌握 Photoshop:动作及其它
  • 开源的go语言统一配置中心 - nacos + nacos go sdk
  • uniapp:微信小程序文本长按无法出现复制菜单
  • 工信部助力新型储能制造业,CES Asia 2025展现前沿科技
  • Linux高级--3.2.4.1 Linux timer的系统调用方案
  • Levenshtein 距离的原理与应用
  • LeetCode - 初级算法 数组(存在重复元素)
  • 应急指挥系统总体架构方案
  • spring入门程序
  • Java List 集合详解:基础用法、常见实现类与高频面试题解析
  • p44 13-表单使用场景以及分类