2011-03-21 1 views
4

디버깅 매크로를 작성했고 그 안에 시간을 포함하기를 원합니다.이 경우 함수 내 gettimestr()sprintf 패드가 00:00:00으로 패드되어 있기 때문에 작은 버퍼 (길이가 항상 8입니다)를 허용하고 그 안에 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*을 가지고 있었다,하지만 그건 내가 나서서 당신이 볼 수있는 경우 버퍼를 사용의 메모리를 하드입니다.

불행히도 버퍼는 두 번 사용할 수 없습니다 (두 개의 디버그 오류는 다시 선언 오류를 발생시킬 것입니다) 또한 함수에서와 같이 기본 반환시 사라질 것이기 때문에 메모리를 확보하지 못할 것이라고 생각합니다.

내 질문은 : 대신 [8] 그래서 나는 할 수 무료 그것을

  • 내가 malloc() 8 바이트 (즉 지금 필요한 경우 또는 9 \ 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 

여러 용도를 허용하고 각각의 사용 후 버퍼의 할당을 해제 할 것이다.

+0

음, 정확, 버퍼 아마 해제되지 않을 것이다, 그러나 아마로 다음의 호출에 의해 다시 사용됩니다 : 더블 정의의 문제를 overcomming의 경우, 예를 들어, {}로 묶어야 할 수 있습니다 중도 합리적인 컴파일러. 버퍼 공간은 함수가 종료 될 때 재 확보됩니다. –

+0

이것은 훌륭하게 작동하며, 이제는 첫 번째 유용한 매크로를 작성했습니다. –

+0

한 메모, 앞에 닫는 괄호를 넣는 것을 잊었습니다.} while (0); ' –

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

이런 종류의 매크로에'do {...} while (0)'이 실제로 필요하다. 그렇지 않으면'if'와' else'. –

+0

null 바이트에 대해 경고하고 조금 더 생각해 주셔서 감사합니다! –