zoukankan      html  css  js  c++  java
  • linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用

    转自:http://blog.csdn.net/edonlii/article/details/8491342/


    在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。

         下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。

          _FILE____FUNCTION__ __LINE__ 从名字可以直接看出来了,对应的:代码文件函数 行号


    下面就是定义的宏:

    #define ERROR(...) /  
    do{ /  
        fprintf(stderr, "[ERROR  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /  
        fprintf(stderr, __VA_ARGS__); /  
    }while(0)  
      
    #define WARNING(...) /  
    do{ /  
        fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /  
        fprintf(stdout, __VA_ARGS__); /  
    }while(0)  
      
    #define INFO(...) /  
    do{ /  
        fprintf(stdout, "[INFO  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /  
        fprintf(stdout, __VA_ARGS__); /  
    }while(0)  
      
      
    #define SHOW_TIME(...) /  
    do{/  
        extern unsigned long long gLatestTime;/  
        timeval tp;/  
        gettimeofday(&tp, NULL);/  
        unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /  
        if(gLatestTime != 0) /  
        { /  
            fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/  
            fprintf(stdout, __VA_ARGS__); /  
            fprintf(stdout, "/n"); /  
        } /  
        gLatestTime = now;/  
    }while(0)  
      
      
    #ifdef DEBUG  
    #define DBG(...) /  
    do{ /  
        fprintf(stdout, "[DEBUG  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /  
        fprintf(stdout, __VA_ARGS__); /  
    }while(0)  
    #else  
    #define DBG(...)  
    #endif 

    以上是定义的输出文件信息,如果想输出自定义的字符串(类似printf()的功能),可以使用可变参的形式传递。

            如上面的的最后一个DEBUG的定义:

            fprintf(stdout , __VA_ARGS__); 

            这行代码使得用户可以将自己的信息放在可变参里面,例如:DBG("  I am from  %s " , "ICT"); 这句话的输出分成两部分前半部分打印文件名、函数名、行号,后半部分会输出: I am from ICT  这句话。可变参给用户提供了很好的自定义空间。 

           <将在下一篇博文中介绍一下" 可变参 "的用法>

     
       说明:
            stdout -- 标准输出设备 (printf("..")) 同 stdout。 
            stderr -- 标准错误输出设备 两者默认向屏幕输出。 

            但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。




  • 相关阅读:
    ECSHOP获取当前分类所在顶级分类信息
    二级域名会不会分散主域名权重
    ECSHOP增加模板页的方法
    ECSHOP之transport.js/run() error:'process_request' 未定义
    AIR任务栏图标的闪烁
    googlemap数据采集器(三)
    Flex中List自己定义itemrenderer渲染问题的解决
    GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)
    android下歌曲名称乱码的解决办法
    史上最强劲的android模拟器命令详解
  • 原文地址:https://www.cnblogs.com/alan666/p/8312162.html
Copyright © 2011-2022 走看看