zoukankan      html  css  js  c++  java
  • 编译器内置宏__LINE__&__FUNCTION__

    编译器内置宏:

    先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

    ANSI C标准中有几个标准预定义宏(也是常用的):

    __LINE__:在源代码中插入当前源代码行号;

    __FILE__:在源文件中插入当前源文件名;

    __DATE__:在源文件中插入当前的编译日期

    __TIME__:在源文件中插入当前编译时间;

    __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

    __cplusplus:当编写C++程序时该标识符被定义。

    编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

    看到这里,你的眼睛应该一亮了吧,嗯,是的,__FILE__和__LINE__正是我们前面想要的输出的,于是,我们的每一条语句都变成了:

    DEBUG("FILE: %s, LINE: %d…",__FILE__,__LINE__,…)

    其实没有必要,__FILE__本身就会被编译器置换为字符常量,于是乎我们的语句又变成了这样:

    DEBUG("FILE:"__FILE__", LINE: %d…",__LINE__,…)

    但是,我们还是不满足,依然发现,还是很讨厌,为什么每条语句都要写"FILE:"__FILE__", LINE: %d 以及,__LINE,这两个部分呢?这不是浪费我们时间么?

    哈哈,是的,这就是本次大结局,把DEBUG写成这样:

    DEBUG(format,...) printf("FILE: "__FILE__", LINE: %d: "format"/n", __LINE__, ##__VA_ARGS__)

    没错,就是这样!下面,所有的DEBUG信息都会按照这样的方式输出:

    FILE: xxx, LINE: xxx, …….

    最后:

    最后,老规矩,coding测试。

    1. //============================================================================  
    2. // Name : debug.cpp  
    3. // Author : boyce  
    4. // Version : 1.0  
    5. // Copyright : pku  
    6. // Description : Hello World in C++, Ansi-style  
    7. //============================================================================  
    8. #include  
    9. #define __DEBUG__  
    10. #ifdef __DEBUG__  
    11. #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)  
    12. #else  
    13. #define DEBUG(format,...)  
    14. #endif  
    15. int main() {  
    16.     char str[]="Hello World";  
    17.     DEBUG("A ha, check me: %s",str);  
    18.     return 0;  
    19. }  

    测试结果:

    转自:http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html

    除此之外还有__FUNCTION__宏

  • 相关阅读:
    Response.Redirect、Server.Transfer、Server.Execute的区别
    js删除Array指定位置元素方法
    用Json.NET将json字符串反序列化为json匿名对象
    Asp.net中编程方式调用ashx(通过webRequest)
    Server.Transfer中传递ViewState方法
    Ext.Net中Ext.net.DirectMethods无法找到DirectMethod
    IFrame网页加载完成事件
    oracle中grant授权说明
    深度剖析Byteart Retail案例:前言
    深度剖析Byteart Retail案例:仓储(Repository)及其上下文(Repository Context)
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/4783608.html
Copyright © 2011-2022 走看看