zoukankan      html  css  js  c++  java
  • 编译器内置宏实现调试信息输出

    C99中关于编译器内置宏的信息

    6.10.8 Predefined macro names
    The rule that these macros may not be redefined or undefined reduces the complexity of the name space that the programmer and implementor must understand; and it recognizes that these macros have special built-in properties.
    The macros _ _DATE_ _ and _ _TIME_ _ were added in C89 to make available the time of translation. A particular format for the expansion of these macros was specified to aid in parsing strings initialized by them.
    The macros _ _LINE_ _ and _ _FILE_ _ were added in C89 to give programmers access to the source line number and file name.
    The macro _ _STDC_ _ allows for conditional translation on whether the translator claims to be standard-conforming. It is defined as having the value1. Future versions of the Standard could define it as 2, 3, etc., to allow for conditional compilation on which version of the Standard a translator conforms to. The C89 Committee felt that this macro would be of use in moving to a conforming implementation.
    The macro _ _STDC_VERSION_ _ was added in C95.
    A new feature of C99: C99 adds two additional predefined macros: _ _STDC_IEC_559_ _ and _ _STDC_IEC_559_COMPLEX_ _.

    基本上,我们会使用到的有:

    __DATE__ 编译日期

    __TIME__ 编译时间

    __FILE__ 编译文件路径

    __LINE__ 当前源码所在行号

    C99中关于不定参数宏定义的支持

    A new feature of C99: C89 introduced a standard mechanism for defining functions with
    variable numbers of arguments, but did not allow any way of writing macros with the same
    property. For example, there is no way to write a macro that looks like a call to printf.
    This facility is now available. The macro definition uses an ellipsis in the same way to indicate a
    variable argument list. However, since macro substitution is textual rather than run-time, a
    different mechanism is used to indicate where to substitute the arguments: the identifier
    _ _VA_ARGS_ _. This is replaced by all the arguments that match the ellipsis, including the
    commas between them.
    For example, the following macro gives a “debugging printf”:
    #ifdef DEBUG
    #define dfprintf(stream, ...) \
    fprintf(stream, "DEBUG: " _ _VA_ARGS_ _)
    #else
    #define dfprintf(stream, ...) ((stream, _ _VA_ARGS_ _, 0))
    #endif
    #define dprintf(...) dfprintf(stderr, _ _VA_ARGS_ _)
    For example,
    dprintf("X = %d\n", x);
    expands to
    dfprintf(stderr, "X= %d\n", x);
    and thus to one of
    fprintf(stderr, "DEBUG: " "X = %d\n", x);
    or
    ((stderr, "X = %d\n", x, 0));
    If DEBUG is true, this calls fprintf, but first catenating "DEBUG: " to the format (which
    must therefore be a simple string). Otherwise it creates a comma expression (so that the
    arguments are still evaluated) with the value zero.
    There must be at least one argument to match the ellipsis. This requirement avoids the problems
    that occur when the trailing arguments are included in a list of arguments to another macro or
    function. For example, if dprintf had been defined as
    #define dprintf(format, ...) \
    dfprintf(stderr, format, _ _VA_ARGS_ _)
    and it were allowed for there to be only one argument, then there would be a trailing comma in
    the expanded form. While some implementations have used various notations or conventions to
    work around this problem, the Committee felt it better to avoid the problem altogether.
    Similarly, the _ _VA_ARGS_ _ notation was preferred to other proposals for this syntax.

    调试宏定义样例:

    #include  
    
    #define __DEBUG__  
    
    #ifdef __DEBUG__  
    
    #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)  
    
    #else  
    
    #define DEBUG(format,...)  
    
    #endif  

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

    就算黑夜也有星光。
  • 相关阅读:
    教育网玩QQ游戏解决办法
    国家重点实验室分布<转>
    MySQL存储过程错误No data zero rows fetched, selected, or processed
    安装Oracle Developer后 pl sql无法使用
    Jsp开发入门
    开源项目MiniOA协同办公系统介绍
    JavaScript实现网页单击事件
    (转)普及基础知识一
    “人脸识别程序”总结
    (转)如何加速Altera的EDA工具? (IC Design) (Quartus II) (Nios II) (SOPC Builder)
  • 原文地址:https://www.cnblogs.com/shijiezhenmei/p/3652145.html
Copyright © 2011-2022 走看看