2009-12-14 2 views
0

Я использую следующий макрос для печати отладочной информации, которую я нашел в Интернете. Он отлично работает. Однако, я хотел бы включить-выключить отладочный печати для функции А при отладке функции B, которая вызывает функцию A. Я попытался #define NDEBUGfunction A#undef NDEBUG но не удалось подавить печать в функции А.Отключение макросов DEBUG для определенной функции (NDEBUG)

Любая помощь будет очень оценили. Любые предложения по альтернативным способам решения задачи также приветствуются.

Благодаря ~ 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 */ 

ответ

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 */ 

Тогда, в функции А():

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

Это будет отлаживать B() при вызове из любого места, кроме как от A(). Чтобы получить отладочную информацию, вам нужно будет указать MY_DEBUG, а NDEBUG не определено.

Edit: Вам нужно будет определить MY_DEBUG, когда вы хотите скомпилировать с отладкой, но мы надеемся, что вы используете make или какой-либо другой инструмент сборки, так что это должно быть легко.

+0

Hi Alok, Thankshis для ответа. Я не смог заставить это работать. Кажется, что единственный способ включить/отключить отладочные макросы - это NDEBUG // MY_DEBUG определено/не определено до определения макроса. Использование #define/#undef после того, как сам макрос был определен, по-видимому, не действует как переключатель. ~ rt – user151410

+0

См. мое редактирование. Вы хотите определить MY_DEBUG и не определять NDEBUG, если хотите отладки. Если вы определите NDEBUG или не определите MY_DEBUG, отладки не будет. Все эти «определения» должны выполняться при компиляции, например: 'gcc -DMY_DEBUG file.c'. –

1

Возможно, вы должны перенести трассировку в модуль, чтобы вы могли динамически включать и отключать трассировку во время выполнения, и таким образом вы можете специально отключить его для вызова функции. В режиме выпуска вы можете заменить все трассировки пустыми операторами, хотя, по моему опыту, мне хорошо сохранять трассировку в режиме выпуска - на всякий случай.

Смежные вопросы