0

我正在使用以下宏来打印我在网上找到的调试信息。它工作得很好。但是,我想在调试调用函数 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 */
4

2 回答 2

1

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

于 2009-12-14T01:53:47.113 回答
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()这将在从除 from 之外的任何地方调用时进行调试A()。要进行调试,您将需要MY_DEBUG被定义和NDEBUG未定义。

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

于 2009-12-14T00:26:16.840 回答