2011-03-21 60 views
4

我已經寫了一個調試宏,並希望在其中包含時間,在這種情況下,我的函數gettimestr()接受一個小緩衝區(長度始終爲8,因爲其sprintf填充到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回報const char*,但是這是很難的,所以我說幹就幹,使用的緩衝區,如果你能看到的可用內存。

不幸的是緩衝區不能被使用兩次(兩個DEBUGPRINTs會給出一個重新聲明錯誤)並且我相信它不會釋放內存,因爲它在主返回時會消失,因爲它不在函數中?

我的問題是:

  • 我應該malloc() 8個字節(或9,如果 爲\ 0,我不知道如果這是現在需要 )上,而不是[8]這樣我就可以 釋放它在堆中需求?
  • 我應該如何創建 緩衝區,銷燬引用,並在另一個宏調用中重用 以修復我的 問題,我無法將其稱爲 兩次?

回答

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 

將允許多個應用,並在每次使用後解除分配緩衝區。

+0

嗯,準確,緩衝可能不會被釋放,但它可能會通過下一次調用被重用任何中途合理的編譯器。當函數退出時,緩衝區空間將被回收。 – 2011-03-21 11:49:56

+0

這很好用,現在我寫了第一個有用的複雜宏! – 2011-03-21 12:36:36

+0

有一點需要注意,在while(0);' – 2011-03-21 12:36:55

0

您應該分配9個字節來包含'\0'字節。最好的方法是通過發佈在代碼中的數組來創建它。對於overcomming雙定義的問題,您可以將其括在{},如:

#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 
+1

對於這種宏,您確實需要'do {...} while(0)',否則當在'if'和' else'。 – 2011-03-21 11:55:13

+0

謝謝你警告我關於空字節和更多關於這個想法! – 2011-03-21 12:35:10