zoukankan      html  css  js  c++  java
  • C/C++ 打印文件名、行号、函数名的方法

     转自:http://zhidao.baidu.com/link?url=JLCaxBAXLJVcx_8jsyJVF92E_bZjo4ONJ5Ab-HGlNBc1dfzcAyFAIygwP1qr18aaMA_a1gTjCNV5yhhJ4YnBTLjSXqY1rSKk2v1p8pUP8K_

     #include <stdio.h>
    #include <stdlib.h>
     
    #define LOG() printf("func here %s ", __FUNCTION__)//注:两个短下划线_ _
     
    void func(){
        LOG();
    }  
     
    int main(){
        LOG();
        func();
        //system("pause");
    }
     

    转自:http://blog.csdn.net/cabinriver/article/details/8960119

    今天跟踪一段开源代码的时候,因为对代码不太熟悉,所以要打印一些关键的信息。便顺手整理了一下这个能打印文件名、行号、函数名的宏。

    1、打印文件名、行号、函数的两种方式

    [cpp] view plain copy
     
    1. /************************************************************************** 
    2.     *  @Copyright (c) 2013, ChenMH, All rights reserved. 
    3.  
    4.     *  @file     : main.cpp 
    5.     *  @version  : ver 1.0 
    6.  
    7.     *  @author   : ChenMH 
    8.     *  @date     : 2013/05/22 14:07 
    9.     *  @brief    : 打印文件名、行号、函数名的方法。 
    10. **************************************************************************/  
    11. #include <cstdio>  
    12.   
    13. //定义打印宏,并在打印信息前加入文件名、行号、函数名  
    14.   
    15. //此宏展开后,类似于printf("123"),printf("456");  
    16. #define TRACE_CMH_1 (printf("%s(%d)-<%s>: ",__FILE__, __LINE__, __FUNCTION__), printf)  
    17.   
    18. //此宏展开后,类似于printf("%d""%d", 1, 2);  
    19. #define TRACE_CMH_2(fmt,...)   
    20.     printf("%s(%d)-<%s>: "##fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)  
    21.   
    22. //注:由于第一个宏TRACE_CMH_1调用了两次printf,所以效率没有第二个宏高。  
    23. //如果编译器支持C99标准的话,可以用第二个宏。  
    24.   
    25. int count = 1;  
    26.   
    27. class CBase  
    28. {  
    29. public:  
    30.     CBase()  
    31.     {  
    32.         //打印当前行所在文件、行号、函数,以及其它信息。  
    33.         TRACE_CMH_2("BASE: [%d] ", count++);  
    34.     }  
    35. };  
    36.   
    37. class CSub : public CBase  
    38. {  
    39. public:  
    40.     CSub()  
    41.     {  
    42.         //打印当前行所在文件、行号、函数,以及其它信息。  
    43.         TRACE_CMH_1("SUB: [%d] ", count++);  
    44.     }  
    45. };  
    46.   
    47. int main(int argc, char **argv)  
    48. {  
    49.     CSub sub;  
    50.   
    51.     return 0;  
    52. }  

    2、在项目中使用

    [cpp] view plain copy
     
    1. /******************************************************** 
    2.     *  @author   : ChenMH 
    3.     *  @date     : 2013/05/24 10:11 
    4.     *  @brief    : 定义调试打印宏 
    5. ********************************************************/  
    6. #define _DEBUG_TRACE_CMH_ 2  
    7. #if 0 != _DEBUG_TRACE_CMH_  
    8.     #include <cstdio>  
    9. #endif  
    10.   
    11. #if 1==_DEBUG_TRACE_CMH_    //普通打印  
    12.     #define TRACE_CMH printf  
    13. #elif 2==_DEBUG_TRACE_CMH_  //打印文件名、行号  
    14.     #define TRACE_CMH(fmt,...)   
    15.         printf("%s(%d): "##fmt, __FILE__, __LINE__, ##__VA_ARGS__)  
    16. #elif 3==_DEBUG_TRACE_CMH_  //打印文件名、行号、函数名  
    17.     #define TRACE_CMH(fmt,...)   
    18.         printf("%s(%d)-<%s>: "##fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)  
    19. #else  
    20.     #define TRACE_CMH  
    21. #endif //_TRACE_CMH_DEBUG_  
    22. /*******************************************************/  

    这段代码中用到了这几个宏:
      1) __VA_ARGS__   是一个可变参数的宏,这个可宏是新的C99规范中新增的,目前似乎gcc和VC6.0之后的都支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用。
      2) __FILE__    宏在预编译时会替换成当前的源文件名
      3) __LINE__   宏在预编译时会替换成当前的行号
      4) __FUNCTION__   宏在预编译时会替换成当前的函数名称
  • 相关阅读:
    linux学习笔记31--命令route和routetrace
    你大概走了假敏捷:认真说说敏捷的实现和问题【转】
    如何管理好自己的测试团队【转】
    Linux 服务器配置JDK
    替换jar包内指定的文件
    Jenkins maven仓库地址 和 手动修改maven 版本
    逻辑英语 第四季 Speaking and Listening
    Linux下,部署多个Tomcat
    逻辑英语 第三季
    Jmeter+Ant+Jenkins接口自动化测试框架搭建
  • 原文地址:https://www.cnblogs.com/shirishiqi/p/5431627.html
Copyright © 2011-2022 走看看