调试利用内存并释放其中的宏?

时间:2011-03-21 11:42:22

标签: c pointers macros heap c-preprocessor

我编写了一个调试宏,并希望在其中包含时间,在这种情况下,我的函数gettimestr()接受一个小缓冲区(总长度为8,因为它的sprintf填充到{{1并且包含00:00:00内的{}。我的宏看起来如下:

fprintf

我的第一次尝试是让#define _DEBUGPRINT(...) fprintf(stderr, __VA_ARGS__); #ifndef NDEBUG # define WHERESTR "[[%s] file %s, line %d]: " # define WHEREARG timebufstr_0, __FILE__, __LINE__ # define DEBUGPRINT(_fmt, ...) \ char timebufstr_0[8]; \ gettimestr( timebufstr_0 );\ _DEBUGPRINT(WHERESTR _fmt, WHEREARG, __VA_ARGS__) #else # define DEBUGPRINT(_fmt, ...) /**/ #endif 返回gettimestr,但这很难释放内存,所以我继续使用缓冲区,如果你能看到的话。

不幸的是缓冲区不能两次使用(两个DEBUGPRINT会给出重新声明错误)而且我相信它不会释放内存,因为它会在main返回时消失,因为它不在函数中?

我的问题是:

  • 我应该const char* 8个字节(或9个if 对于\ 0,我不知道是不是 现在需要)而不是[8]所以我可以 在堆中按需释放它?
  • 我应该如何创建 缓冲区,销毁引用和重用 它在另一个宏调用来修复我的 我无法称之为的问题 两次?

2 个答案:

答案 0 :(得分:3)

#define _DEBUGPRINT(...)    fprintf(stderr, __VA_ARGS__);
#ifndef NDEBUG
#  define WHERESTR  "[[%s] file %s, line %d]: "
#  define WHEREARG  timebufstr_0, __FILE__, __LINE__
#  define DEBUGPRINT(_fmt, ...) \
   do { \
      char timebufstr_0[8]; \
      gettimestr( timebufstr_0 );\
      _DEBUGPRINT(WHERESTR _fmt, WHEREARG, __VA_ARGS__) \
   } while (0);
#else
#  define DEBUGPRINT(_fmt, ...)  /**/
#endif

允许多次使用并在每次使用后释放缓冲区。

答案 1 :(得分:0)

您应该为包含'\0'字节分配9个字节。最好的方法是通过代码中发布的数组来创建它。对于过度使用双重定义的问题,可以将其括在{}中,例如:

#define _DEBUGPRINT(...)    fprintf(stderr, __VA_ARGS__);
#ifndef NDEBUG
#  define WHERESTR  "[[%s] file %s, line %d]: "
#  define WHEREARG  timebufstr_0, __FILE__, __LINE__
#  define DEBUGPRINT(_fmt, ...) \
          {\ // <---------
          char timebufstr_0[9]; \
          gettimestr( timebufstr_0 );\
          _DEBUGPRINT(WHERESTR _fmt, WHEREARG, __VA_ARGS__)\
          } // <---------
#else
#  define DEBUGPRINT(_fmt, ...)  /**/
#endif