最近在做一个spider,封装的log宏如下:
#define SPIDER_LOG(level, format, ...) do{ \
if(level >= g_conf->log_level) {\
time_t now = time(NULL); \
char msg[MAX_MESG_LEN]; \
char buf[32]; \
sprintf(msg, format, ##_VA_ARGS_); \
strftime(buf, sizeof(buf), "%Y%m%d %H:%M:%S", localtime(&now)); \
fprintf(stdout, "[%s] [%s] %s\n", buf, LOG_STR[level], msg);\
fflush(stdout); \
}\
if(level == SPIDER_LEVEL_ERROR) { \
exit(-1); \
} \
} while(0)
localtime返回的指针被直接引用了!
很显然,指针指向的必然是静态存储区,或者是在堆(动态分配)。否则后果很严重(栈,你懂得)。
事实上,localtime实现的一种方式类似如下(静态变量):
struct tm *localtime( const time_t *time )
{
static struct tm _tm;
...
return &_tm;
}