如何从c代码中删除所有debuggingprintf语句

我想从我的代码中删除所有的debuggingprintf语句。如何通过打开/closuresdebugging语句来使用条件debugging?

Iam使用printf只是为了检查一个特定的值是否正在发生变化,如下所示:printf(“value read%d \ n”,a);

Solutions Collecting From Web of "如何从c代码中删除所有debuggingprintf语句"

没有办法,你可以做到这一点,而不需要使用你的编辑器。

你可以做的是:

Allen Holub在他的书中建议使用以下调试宏:

#ifdef DEBUG # define D(x) x #else # define D(x) #endif 

并像这样使用它:

 D(printf("oh, hai, debug")); 

替换DEBUG()所有printf()调用。 DEBUG是一个宏定义为:

 #define DEBUG printf 

这将调用真正的printf()函数,或者也可以将其定义为:

 #define DEBUG fake_printf 

然后调用伪造的printf来抑制调试信息。

伪造的printf函数可能和以下一样蹩脚:

 int fake_printf( const char * format, ... ) { return 0; } 

你应该解释你如何进行调试printf 。 一个简单的方法可能是有一个宏像

 bool debug_flag; // to be set in the debugger or at initialization pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; #define debugprintf(Fmt,...) debugprintf_at(__FILE__,__LINE__,Fmt,__VA_ARGS__) #ifndef NDEBUG #define debugprintf_at(Fil,Lin,Fmt,...) do {if (debug_flag) { \ pthread_mutex_lock(&debug_mutex); \ fprintf (stderr, "%s:%d %s:" Fmt, Fil, Lin, __func__, \ ##__VA_ARGS__); \ pthread_mutex_unlock(&debug_mutex); } \ } while(0) #else #define debugprintf(Fmt,...) do {} while(0) #endif 

(它使用互斥锁,因为您不想混合来自不同线程的调试printf消息;如果您不使用任何线程,请移除互斥锁及其锁定。

如果你的问题是如何在一个巨大的软件(有它的源代码)中找到所有调试printf,你可以尝试使用grep或者像GCC插件或MELT扩展那样更有趣的东西。 但是这样的方法(GCC定制)需要花费一些时间(一周或者更多的工作),而且仅仅为了巨大的软件基础(例如数百万条源代码)才值得。

对于一个不太大的软件,只要手动检查代码中的所有printf ,并用debugprintf宏调用替换那些您认为用于调试的debugprintf

在visual studio中,如果printf是在一行上,你可以使用正则表达式查找/替换来移除printf语句。 好吧,这将是非常费力,但可能工作。

或者,编写另一个控制台应用程序来解析你的代码,并为你做这个(你可以处理多行语句)。

关于调试日志记录的一个很好的模式是使用全局函数或宏来替换整个代码中的printf语句并调用它。 例如,如果你有一个全局的Log(const char *消息)函数(或者宏),如果你想改变日志的运行方式,而不是用预处理器语句来代替你的代码,那么你可以改变这个实现。

比这更进一步,有许多日志框架 (和这里 )执行相同的事情,但具有更多的可配置性。

这是我使用的一种方法:

 #if !defined ( NDEBUG ) void PrintMsg( const char_t* pFormat, ... ) { va_list args; va_start( args, pFormat ); (void)vprintf( pFormat, args ); va_end( args ); } #else void PrintMsg( const char_t*, ... ) { } #endif #define DBG_PRINTF PrintMsg 

然后将代码中的所有“printf”替换为“DBG_PRINTF”

它也会执行printf函数的参数。

不知道这是否是问题。 我个人喜欢有单独的功能/宏的调试信息,这是启用预处理器指令。 如果你想从生产代码中删除调试输出…不能想到任何自动化的方式