定制自己的打印函数---初级篇

  

  平时在Linux平台写代码的时候,虽然gdb的调试功能很强大,但很多时候我更喜欢调用系统打印函数来调试我的程序,可是直接调用的话难免显得很愚蠢(中国好像就是不缺愚蠢的coder),除非我需要打印的地方不超过3处,否则我是绝对无法容忍的,可是应该怎么做呢,别急,先去倒杯白开水,然后随便泡点什么,再坐下来一步一步慢慢的整理。

  首先要先明确自己的需求,限于是初级篇,所以我设定的需求是:

  • 可以像系统打印函数一样打印信息;
  • 使用上不能比系统打印函数更复杂;
  • 可以自动输出打印信息的具体位置;
  • 具备统一开启和关闭打印功能;

要满足以上需求,好像没有比宏定义更好的解决方案了,先来看一个GCC风格的:

#define mydebug(format, args...)  printf(format, ##args)

如果你并不使用GCC来编译你的C程序,那么可以使用C99风格的方式:

#define mydebug(format, ...)  printf(format, ##__VA_ARGS__)

至于用哪一种,我的建议是:虽然GCC风格的可读性更好一点,但毕竟它不是C语言的标准,所以还是用标准风格吧。也许有人会对‘##’有所疑问,其实它的主要作用就是连接前后两个参数,如果后一个参数为空,就会去掉多余的逗号,防止语法上出现错误。

  到目前为止上面的宏定义只能满足前两个需求,下面让我们来看看第三个需求,这时就需要用到一些标准预定义宏:

  • __LINE__:在源代码中插入当前源代码行号
  • __FILE__:在源文件中插入当前源文件名
  • __DATE__:在源文件中插入当前的编译日期
  • __TIME__:在源文件中插入当前编译时间
  • __func__:在源代码中插入当前函数名
  • __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1
  • __cplusplus: 当编写C++程序时该标识符被定义

好像函数名相关的宏还有__FUNC__, __FUNCTION__,至于到底用哪一个,我想说的是“标准才是王道”。有了这些宏,剩下的问题就很简单了,现在让我们一次性解决所有的需求,看剑:

#if 1

#define mydebug(format, ...)  printf("[%s:%d] "format"", __FILE__, __LINE__, ##__VA_ARGS__)

#else

#define mydebug(format, ...)

#endif

目前这种方式是最初级的定制,应付小规模的调试足够了,如果觉得上面的格式不喜欢,可以尽情的去改成你喜欢的格式,我只是提供了一份模板而已,鉴于本篇的主题,所以不再进行深入的探讨,下一节,我会让我们的打印函数具有等级的概念,还会根据不同的等级输出不同的颜色,敬请期待......

时间: 2024-12-29 12:36:37

定制自己的打印函数---初级篇的相关文章

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量. URL重写与优化就是搜索引擎优化的手段之一. 假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的, http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&p

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET Identity ASP.NET Identity 其他API介绍 小节 在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP.NET Identity的建

NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者

NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者 作者: raindy 来源:http://bbs.hanzify.org/index.php?showtopic=30029 时间:2005-02-15 点击:70791 raindy NSIS简介: NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System)的缩写,它是一个免费的 Win32 安装.卸载系统,它的特点:脚本简洁高效:系统开销小:当然进行安装.

python_way ,day7 面向对象 (初级篇)

面向对象 初级篇 python支持 函数 与 面向对象 什么时候实用面向对象? 面向对象与函数对比 类和对象 创建类 class 类名 def 方法名(self,xxxx) 类里面的方法,只能对象去调用 对象 = 类名() 通过对象执行方法 对象.方法名(xxxx) 设计,增删改查功能 函数式: def fetch(self,host,port name passwd,sql) pass def create(self,host,port name passwd,sql) pass def re

【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)

本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数

python 面向对象初级篇

Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强-" 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. Python while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘

在Eclipse中使用JUnit4进行单元测试(初级篇)【转】

来自[http://blog.csdn.net/andycpp/article/details/1327147] 本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个

Objective-C与Swift下的自定义打印函数(Debug和Release)

1.Objective-C 在使用Objective-C进行开发的过程中,为了Debug会不断的设置打印函数.如下图是我们经常用的,用来测试监听方法的实现与否: 1 NSLog(@"%s", __func__); 2 NSLog(@"%s", __FUNCTION__); 需要说明的是,__func__和__FUNCTION__都是C的预定义符号,代表的含义完全相同,就是返回 类名+方法名 的字符串. 注意:1.返回的字符串是C语言的字符串 char * 类型,注意

零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce

此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为hadoop1.X.hadoop2.X,并且还有hadoop生态系统.这里只能慢慢介绍了.一口也吃不成胖子. hadoop 1.x分为mapreduce与hdfs 其中mapreduce是很多人都需要迈过去的槛,它比较难以理解,我们有时候即使写出了mapreduce程序,但是还是摸不着头脑.我们不知道ke