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);

このSOの回答から:

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

intprintf が期待する型が引数と同じ型ではないため、コンパイラは警告を発行しますlong(これが実際の型__suseconds_tです)。あなたのコードは、intlongが同じサイズ (32 ビットまたは 64 ビット) であれば、現在の多くのシステムで動作します。

これ当てはまらないシステム (int 32 ビット、long 64 ビットなど) があるため、移植性を高めるために、値を実際の型にキャストする必要がありますprintf

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

の値tv.tv_usecは常に 100 万未満であるため、少なくとも 32 ビットの int を持つシステムでは int"%06d"へのキャストも機能しますが、私は long のままにすることを好みます。

ちなみに、この警告は、最近使用されているすべての typedef の問題を指摘しています。longメッセージがの代わりに、またはそれに加えて言及されていれば、比較的初心者でも実際の問題を理解するチャンスがあったと思います__suseconds_t。clang コンパイラは実際にこれを行います: "'__suseconds_t' (aka 'long')".

于 2014-06-30T09:25:26.213 に答える
1

構造体のtv_usecメンバーはデータ型であり、これは への typedefです。の代わりに で表示できます。struct tv__suseconds_tlong%06ld%06d

longそして、少なくとも移植性の問題については、へのキャストの方が良いようです。

于 2014-06-30T09:58:45.070 に答える