1

我正在使用这段代码:

struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];

gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06d", tmbuf, tv.tv_usec);

从这个答案:

https://stackoverflow.com/a/2409054/997112

将 struct timeval 打印为可读格式。但是,我收到此编译器警告:

warning: format '%06d' expects type 'int', but argument 5 has type '__suseconds_t'

有人可以帮忙吗?

4

2 回答 2

4

编译器发出警告,因为 printf 预期的类型 -int与参数类型不同 - long(这是什么__suseconds_t)。您的代码将适用于许多当前系统,无论何时int并且long大小相同(32 位或 64 位)。

由于有些系统不是这种情况(例如 int 32 位,long 64 位),为了更好的可移植性,您应该将值转换为printf期望的实际类型:

snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, (long) tv.tv_usec);

由于 的值tv.tv_usec始终小于一百万,因此在具有至少 32 位 int 的系统上,"%06d"转换为 int 也可以,但我更愿意使用 long。

顺便说一句,警告指出了这些天使用的所有 typedef 的问题。我认为如果消息中提到long而不是__suseconds_t. clang 编译器实际上是这样做的:"'__suseconds_t' (aka 'long')".

于 2014-06-30T09:25:26.213 回答
1

结构的tv_usec成员struct tv是一个__suseconds_t数据类型,它是一个 typedef to long%06ld您可以使用代替来显示它%06d

long至少在可移植性问题上,这似乎会更好。

于 2014-06-30T09:58:45.070 回答