关闭特定功能的DEBUG宏(NDEBUG)

时间:2009-12-14 00:19:17

标签: c macros ndebug

我正在使用以下宏来打印我在网络上找到的调试信息。它很棒。 但是,我想在调试函数B时关闭函数A的调试打印,函数B调用函数A.我尝试#define NDEBUG function A #undef NDEBUG但是没有设法抑制打印功能A.

任何帮助将不胜感激。 任何关于完成任务的替代方法的建议也是受欢迎的。

谢谢~RT

#ifdef NDEBUG
/*
  If not debugging, DEBUGPRINT NOTHING.
*/
#define DEBUGPRINT2(...) 
#define DEBUGPRINT(_fmt,G ...) 
#else
/*
  Debugging enabled:
*/
#define WHERESTR  "[file %s, line %d]: "
#define WHEREARG  __FILE__, __LINE__
#define DEBUGPRINT2(...)       fprintf(stderr, __VA_ARGS__)
#define DEBUGPRINT(_fmt, ...)  DEBUGPRINT2(WHERESTR _fmt, WHEREARG, __VA_ARGS__)
#endif /* NDEBUG */

2 个答案:

答案 0 :(得分:1)

也许您应该将跟踪包装到模块中,以便您可以在运行时动态打开/关闭跟踪,这样您就可以专门为函数调用关闭它。在发布模式下,你可以用空语句替换所有跟踪,尽管根据我的经验,我发现在发布模式中保持跟踪也是好的 - 以防万一。

答案 1 :(得分:0)

NDEBUG在包含assert.h时很有用,因此#define NDEBUG / #undef NDEBUG以后不会做任何事情。

你可以这样做:

#if defined(NDEBUG) || !defined(MY_DEBUG)
/*
  If not debugging, DEBUGPRINT NOTHING.
*/
#define DEBUGPRINT2(...) 
#define DEBUGPRINT(_fmt,G ...) 
#else
/*
  Debugging enabled:
*/
#define WHERESTR  "[file %s, line %d]: "
#define WHEREARG  __FILE__, __LINE__
#define DEBUGPRINT2(...)       fprintf(stderr, __VA_ARGS__)
#define DEBUGPRINT(_fmt, ...)  DEBUGPRINT2(WHERESTR _fmt, WHEREARG, __VA_ARGS__)
#endif /* NDEBUG */

然后,在函数A()中:

...
#undef MY_DEBUG
result = B();
#define MY_DEBUG
...

当从B()以外的任何地方调用A()时,这将调试MY_DEBUG。要进行调试,您需要定义NDEBUG并且MY_DEBUG未定义。

编辑:当您想要使用调试进行编译时,需要定义make,但希望您使用{{1}}或其他一些构建工具,所以这应该很容易。