我编写了一个调试宏,并希望在其中包含时间,在这种情况下,我的函数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]所以我可以
在堆中按需释放它? 答案 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