zoukankan      html  css  js  c++  java
  • C语言中宏定义的一个变态用法(转载)

     

    在程序调试时,我们经常需要输出一些调试信息,当调试完毕后,就不再需要使用了。那怎么快速的在调试状态和发布状态切换呢?通常我们使用预编译加宏定义来处理这个问题,例如:

    #ifdef DEBUG
     调试代码
    #endif

    如果我们使用printf来显示一些调试信息,那么每个地方都加上#ifdef和#endif就很麻烦了。我们可以定义一个DbgPrintf的函数来专门处理这些事情,只在DbgPrintf函数内放上#ifdef和#endif就行了。但是这样代码在运行时,还是有调用一次函数的,浪费了时间。那么可不可以利用宏定义,实现完全没有编译代码产生的宏呢?
    可以尝试下面的宏代码:

    #ifdef DEBUG
    #define DbgPrintf printf
    #else
    #define DbgPrintf /\
    /DbgPrintf
    #endif

    如果DEBUG已经定义了,那么不用说,当然是用printf去代替DbgPrintf了。
    下面只分析DEBUG未定义的情形,这个宏定义实际上是将“DbgPrintf”定义成了“//DbgPrintf”,由于续行符的作用,#define定义时不会发现注释符“//”,但是在展开到代码之后,就成了注释符“//”了,也就是说,如果你原来的代码是DbgPrintf("%d",x);,经过这个宏展开后成了//DbgPrintf("%d",x);,相当于自动在前面加了注释符“//”。要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了。另外,这个宏只能单独一行使用,因为它将该行后面的代码都注释掉了。

    主要是因为有些编译器它不支持不定长参数宏定义,而printf函数刚好又是一个不定长参数的,所以定义为空宏的办法不好搞,才想出了这个一个把宏变成“//”注释的办法。另外还可以使用
    //#define DEBUG
    #ifdef DEBUG
    #define DBG(CODE) CODE
    #else
    #define DBG(CODE)
    #endif

    就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如

    DBG(printf("%d",x);)

    这样就不会出什么问题了,而且还可以在里面写很多行代码。

  • 相关阅读:
    ElasticSearch 高级DSL查询语句
    docker改国内官方镜像
    step1: python & scrapy安装
    step7: 输出到json文件
    step6: item与pipeline
    step5: 编写spider爬取
    step4: Xpath的使用
    step3: 创建jobbole爬虫
    step2: 爬取廖雪峰博客
    解决WAS更新web.xml文件不生效的问题(web_merged.xml是罪魁祸首)
  • 原文地址:https://www.cnblogs.com/zhihaowang/p/10128773.html
Copyright © 2011-2022 走看看