搜索
bottom↓
回复: 38

哪位可以把一个单词宏替换成//,如此非常有利于程序调试!

[复制链接]

出0入0汤圆

发表于 2014-11-27 15:24:30 | 显示全部楼层 |阅读模式
本帖最后由 xtaens 于 2014-11-27 15:37 编辑

如题,移植的一个函数库中N多文件使用了大量的 DEBUG(XXXXX);输出语句(这些语句都在同一行),我不想要这个语句了,又不想一句一句的删除,又不想用查找替换掉,还想有的时候可以把调试打开,输出一些参数。


它的原样子是这样的:
  1. #define DEBUG  printf
复制代码


想了一下似乎可以改改,即用
  1. #define DEBUG  //printf
复制代码


编译提示:Warning[Pe174]: expression has no effect


怎么才能把那个DEBUG  用宏替换成//呢,这样的话整行就用//屏蔽,这样就不编译了,下次使用的时候再修改一下宏,这样是不是很好呢?


比如下面部分语句,前提是不用去修改原来的文件,即使去修改,那好几百的,够你去弄了

  1. switch (bw)
  2.           {
  3.             case NA_80MHz:
  4.               DEBUG("New Mode 80 Mhz ");
  5.               break;
  6.             case NA_22MHz:
  7.               DEBUG("New Mode 22 Mhz ");
  8.               break;
  9.             default:
  10.               DEBUG("Unknown mode ??? ");
  11.               break;
  12.           }
  13.           switch (sd)
  14.           {
  15.             case NA_1us:
  16.               DEBUG("1 us, ");
  17.               break;
  18.             case NA_4us:
  19.               DEBUG("4 us, ");
  20.               break;
  21.             default:
  22.               break;
  23.           }
  24.           switch (br)
  25.           {
  26.             case NA_250k_S:
  27.               DEBUG("250 kSym\r\n");
  28.               break;
  29.             case NA_1M_S:
  30.               DEBUG("1 MSym\r\n");
  31.               break;
  32.             default:
  33.               break;
  34.           }
  35.           break;
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-11-27 15:24:31 | 显示全部楼层
本帖最后由 dr2001 于 2014-11-27 15:58 编辑

如果你用C99编译器的话,定义修改为:
#define DEBUG(...)
即可。

如果你用的是C90的编译器,不支持变参数宏的话,没有好办法,必须调用空的inline函数,然后让编译器优化掉。比如:
static inline int _dummy_printf(const char * fmt, ...) {
}
#define DEBUG _dummy_printf
自己替换inline为你编译的内联名称。

直接替换函数名是个比较2的写法,会造成很多麻烦事儿;尤其是printf这种,用到了不定长参数的情况。

出0入442汤圆

发表于 2014-11-27 15:27:23 | 显示全部楼层
#if() #else()
#if defined() #else()
注意需要常量。

出0入22汤圆

发表于 2014-11-27 15:27:40 | 显示全部楼层
直接把宏改为空格即可

出0入0汤圆

发表于 2014-11-27 15:28:47 | 显示全部楼层
  1. #if 1
  2. #define dmsg(x...) do{printf(x);}while(0)
  3. #else
  4. #define dmsg(x...)   
  5. #endif
复制代码


试一试这样行吗?

出0入0汤圆

发表于 2014-11-27 15:29:12 | 显示全部楼层
把printf替换成自定义函数。这函数什么都不做。

出0入0汤圆

发表于 2014-11-27 15:30:53 | 显示全部楼层
本帖最后由 kakarotto 于 2014-11-27 15:32 编辑

重写printf函数,改成

__inline void printf(void *s)
{

}

出0入0汤圆

发表于 2014-11-27 15:32:23 | 显示全部楼层
//是编译器定义的,除了去搞编译器才能改;不过编译器你是改不了的。所以,你不能改。

出0入0汤圆

 楼主| 发表于 2014-11-27 15:32:23 | 显示全部楼层
wye11083 发表于 2014-11-27 15:27
#if() #else()
#if defined() #else()
注意需要常量。

这样太麻烦了,而且会修改原文件

出0入0汤圆

发表于 2014-11-27 15:34:40 | 显示全部楼层

直接
#define DEBUG    printf
改成
#define DEBUG

#define DEBUG    do{}while(0)

就可以了吧

出0入93汤圆

发表于 2014-11-27 15:35:51 | 显示全部楼层
查找 #define DEBUG
替换成 //#define DEBUG

需要恢复的时候再
查找 //#define DEBUG
替换成 #define DEBUG

出0入0汤圆

 楼主| 发表于 2014-11-27 15:36:15 | 显示全部楼层
jiaowoxiaolu 发表于 2014-11-27 15:27
直接把宏改为空格即可

不行,()里面的语句还会被编译的

出0入0汤圆

发表于 2014-11-27 15:36:19 | 显示全部楼层
一直用的条件编译!

出0入0汤圆

 楼主| 发表于 2014-11-27 15:37:11 | 显示全部楼层
tim 发表于 2014-11-27 15:35
查找 #define DEBUG
替换成 //#define DEBUG

源文件有10多个,每个文件都有,替换不是个好办法

出0入0汤圆

 楼主| 发表于 2014-11-27 15:39:23 | 显示全部楼层
Puppey 发表于 2014-11-27 15:36
一直用的条件编译!

我也一直用条件编译,但这个文件是别人写的,没有用

出0入0汤圆

发表于 2014-11-27 15:39:48 | 显示全部楼层
        #define DEBUG(a)  ((void)0)

出0入0汤圆

 楼主| 发表于 2014-11-27 15:41:40 | 显示全部楼层
KongQuan 发表于 2014-11-27 15:29
把printf替换成自定义函数。这函数什么都不做。

字符串还好弄,那个参数怎么办?

出0入0汤圆

发表于 2014-11-27 15:46:32 | 显示全部楼层
  1. #if 1
  2. #define DEBUG(x...) do{printf(x);}while(0)
  3. #else
  4. #define DEBUG(x...)   
  5. #endif
复制代码


好吧,我再打一遍。

出0入0汤圆

 楼主| 发表于 2014-11-27 15:47:12 | 显示全部楼层
收到一个:需要重写   NoDebugging(args, ...)

出0入0汤圆

发表于 2014-11-27 15:49:12 | 显示全部楼层
楼主如果觉得调试信息都在同一行不方便查看,可以试一下这样。
  1. #if 1
  2. #define DEBUG(x...) do{printf("\n"); printf(x);}while(0)
  3. #else
  4. #define DEBUG(x...)   
  5. #endif
复制代码

出0入0汤圆

发表于 2014-11-27 15:49:53 | 显示全部楼层
xtaens 发表于 2014-11-27 15:41
字符串还好弄,那个参数怎么办?

#include <string.h>
#include <stdio.h>
#include <stdarg.h>


int MyPrintf ( const char * format, ... );


#define Debug myPrintf

int MyPrintf ( const char * format, ... )
{
        returen 0;
}

出0入0汤圆

发表于 2014-11-27 15:52:17 | 显示全部楼层
xtaens 发表于 2014-11-27 15:41
字符串还好弄,那个参数怎么办?

楼主你上面提到的,19楼的代码都可以满足的。

出0入0汤圆

发表于 2014-11-27 15:55:20 | 显示全部楼层
工程中验证过的,见图所示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2014-11-27 15:58:32 | 显示全部楼层
C99版,很简洁:
  1. #if 1
  2. #define DEBUG printf
  3. #else
  4. #define DEBUG(...)
  5. #endif
复制代码

出0入0汤圆

 楼主| 发表于 2014-11-27 15:58:40 | 显示全部楼层
KongQuan 发表于 2014-11-27 15:49
#include
#include
#include

这个测试通过啦

出0入54汤圆

发表于 2014-11-27 16:00:46 | 显示全部楼层
#define DEBUG(xxx) /##/
这样行吗?或者
#define DEBUG(xxx) /#/

不记得是哪个了

出0入0汤圆

 楼主| 发表于 2014-11-27 16:03:02 | 显示全部楼层

测试通过,非常感谢

出0入0汤圆

 楼主| 发表于 2014-11-27 16:05:07 | 显示全部楼层
ijlc1314 发表于 2014-11-27 15:34
直接
#define DEBUG    printf
改成

do{}while(0)不行

空格 也不行

出0入0汤圆

 楼主| 发表于 2014-11-27 16:06:07 | 显示全部楼层
lusson 发表于 2014-11-27 16:00
#define DEBUG(xxx) /##/
这样行吗?或者
#define DEBUG(xxx) /#/

这样不行的

我刚开始也用 # 和转义字符试了,都不行

出0入0汤圆

 楼主| 发表于 2014-11-27 16:07:21 | 显示全部楼层
Gallen.Zhang 发表于 2014-11-27 15:55
工程中验证过的,见图所示

可以使用

非常感谢

出0入0汤圆

 楼主| 发表于 2014-11-27 16:08:33 | 显示全部楼层
dr2001 发表于 2014-11-27 15:57
如果你用C99编译器的话,定义修改为:
#define DEBUG(...)
即可。

debug(...)就可以了。

为啥 debug (...)  多了一个空格就不行了呢

出0入0汤圆

 楼主| 发表于 2014-11-27 16:12:11 | 显示全部楼层
dxgdsx 发表于 2014-11-27 15:46
好吧,我再打一遍。

测试通过,多谢

括号里多了一个x也可以

这个x干什么用的呢

出0入0汤圆

 楼主| 发表于 2014-11-27 16:28:33 | 显示全部楼层
感谢楼上各位的回答,好多人的办法都可以使用。

分数给   dr2001  吧,他回答的比较全面一些

总结:这种情况可以使用2个办法解决:

1:直接用debug(...)  或 debug(x...) 或 debug(args, ...)    或 debug(args, arg...)  替换----------------推荐

2、用自己的函数名替换,然后重写该函数


谢谢各位啦

出0入4汤圆

发表于 2014-11-27 17:32:29 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2014-11-27 17:40:25 | 显示全部楼层
学习了

出0入0汤圆

发表于 2014-11-27 17:53:36 | 显示全部楼层
xtaens 发表于 2014-11-27 15:37
源文件有10多个,每个文件都有,替换不是个好办法

IAR
SI
都可以集体操作哦。几个文件几十个都可以一瞬间搞定

出0入475汤圆

发表于 2014-11-28 13:20:58 来自手机 | 显示全部楼层
我以前是这样 #define DEBUG /\/ 注意最后一个/要换行到第二行,手机没有回车键,晕

出0入0汤圆

发表于 2014-12-1 12:12:47 | 显示全部楼层
si的


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表