zoukankan      html  css  js  c++  java
  • 定制自己的打印函数---初级篇

      

      平时在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

     

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

     

     

     

    作者:潘洪银

    地址:http://www.cnblogs.com/panhongyin

     

  • 相关阅读:
    css常见布局问题
    jsonp原理及同源策略
    执行webpack-dev-server时,提示端口被占用。
    PHP中的<<<运算符
    PHP中的字符串类型
    数据库系统的结构
    HDU 2516 取石子游戏
    常用MySql命令列选
    mysql简单语句
    微信小程序-循环
  • 原文地址:https://www.cnblogs.com/panhongyin/p/5611237.html
Copyright © 2011-2022 走看看