热门标签 | HotTags
当前位置:  开发笔记 > 大数据 > 正文

编码技巧—调试宏

背景:在项目开发过程中,我们常常需要打印日志,比如:文件,函数,行数,编译时间等,这样方便我们调试,提升效率。但是在发布阶段,我们要去掉这些调试日志,这样我们要怎么做呢?1.通过编

背景:

在项目开发过程中,我们常常需要打印日志,比如:文件,函数,行数,编译时间等,这样方便我们调试,提升效率。但是在发布阶段,我们要去掉这些调试日志,这样我们要怎么做呢?

1.通过编译器的内置宏变量,对printf 库函数进行封装,变成自己的调试函数。

2.通过条件编译,去掉调试日志。


一、封装自己的函数

__FILE____LINE____FUNCTION__这三个宏是编译器内置宏定义,分别代表调试信息所在文件、行号、函数。

除此之外,常用的宏还有:__DATE____TIME__,分别代表当前的编译日期与时间。

#define DBG_PRINTF(fmt, args...) \
do\
{\
printf("<> ", __FILE__, __LINE__, __FUNCTION__);\
printf(fmt, ##args);\
}while(0) 


测试:

 

 

 用法和printf一样。


二、关闭debug日志

利用条件编译进行关闭

#define DEBUG 1
#if DEBUG
#define DBG_PRINTF(fmt, args...) \
do\
{\
printf("<> ", __FILE__, __LINE__, __FUNCTION__);\
printf(fmt, ##args);\
}while(0)
#else
#define DBG_PRINTF(fmt, args...)
#endif

 

这中情况,就是利用条件编译,如果,没有定义DEBUG变量,就使DBG_PRINTF定义为空。这样在预处理的时候,就巧妙的去掉了debug日志。

同时,需要注意,DEBUG宏有没有在其他地方定义,会不会出现重复定义?这一点也需要注意。

 


三、关于#和##

注意到 printf(fmt, ##args); 了吗? 其中:##符号是为了处理args不代表任何参数的情况。如果:

当不加##符号时: DBG_PRINTF("Hello world"); 第二条语句会转化为:printf("Hello world\n", );

当加##符号时:    DBG_PRINTF("Hello world"); 第二条语句会转化为:printf("Hello world\n");

前者比或者多了一个逗号,当然不是我们想要的。


3.1 #号

#号作为一个预处理运算符,可以把记号转换成字符串。

例如,如果A是一个宏形参,那么#A就是转换为字符串"A"的形参名。这个过程称为字符串化(stringizing)。以下程序演示这个过程:

#define ADD(A,B)  printf(#A "+" #B "=%d\n",((A)+(B)))   --->  ADD(5,20);   ---> 5+20=25


3.2 ##号

##运算符可以把两个记号组合成一个记号。例:

 

 

四、宏展开

使用编译器,单独执行宏展开的步骤,查看宏展开的结果。

gcc -E  main.c -o main.i

main.i可以通过文本编辑器打开。

 

 

 


 

推荐阅读
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • C盘无法格式化的原因及解决方法
    本文探讨了C盘无法格式化的原因,并提供了详细的解决方案,帮助用户顺利进行系统维护。 ... [详细]
  • Win10 周年更新 14393.1737 的详细内容与改进
    尽管今天不是常规的周二补丁日,微软依然发布了 Win10 周年更新 14393.1737 和 Win10 创意者更新 15063.632。本文将详细介绍 Win10 周年更新 14393.1737 的主要更新内容。 ... [详细]
  • R语言及RStudio的安装步骤详解
    本文详细介绍了如何正确安装R语言及其集成开发环境RStudio。首先,需要确保安装R语言的基础环境,然后再安装RStudio。虽然先安装RStudio在技术上可行,但为了遵循最佳实践,建议先安装R语言。以下是R语言安装包的下载链接。 ... [详细]
  • Ansible:自动化运维工具详解
    Ansible 是一款新兴的自动化运维工具,基于 Python 开发,集成了多种运维工具(如 Puppet、CFEngine、Chef、Func 和 Fabric)的优点,实现了批量系统配置、程序部署和命令执行等功能。本文将详细介绍 Ansible 的架构、特性和优势。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
author-avatar
殇子休
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有