2

コードにこの行があります

`printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port), timeVal.tv_sec, timeVal.tv_usec);`

これは、コンパイル中にgccで表示される警告です

`cc1: warnings being treated as errors
`client12.c: In function ‘main’:
`client12.c:131: warning: format ‘%06ld’ expects type ‘long int’, but argument 5 has type ‘__darwin_suseconds_t’
`client12.c:131: warning: format ‘%06ld’ expects type ‘long int’, but argument 5 has type ‘__darwin_suseconds_t’

私は何を間違っていますか??

PS - 私は含めましtime.hsys/time.h

4

3 に答える 3

2

struct timevalのメンバーのタイプは、システムごとに異なります。他の多くのCデータ型と同様に、安全で移植性の高い方法は、値を出力するときに値をキャストすることです。

printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n",
    inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port),
    (long) timeVal.tv_sec, (long) timeVal.tv_usec);

これは、サイズがlong以下のすべてのデータ型で正しく機能します。そして、このイディオムは非常に一般的であるため、ファイルサイズ(off_tなど)を参照するデータ型には注意が必要ですが、これらの一般的なデータ型のいずれかを長いものより長くすることについてよく考えます。それらはlong long場合によってはあり得ます。

最大限の安全性を確保するには、フォーマットをキャストしlong longて使用しますが、すべての実装がまだサポートしている%lldわけではないため、移植性の問題を別の問題と交換します。そして、それらの時間値がその処理を必要とする実装を見たことがありません。printf%lld

于 2013-03-18T01:55:56.980 に答える
2

番号を正しいタイプにキャストします。

printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port), (long int)(timeVal.tv_sec), (long int)(timeVal.tv_usec));
于 2013-03-18T01:56:59.327 に答える
1

の説明については、sys/types.hを参照してくださいsuseconds_t。どうやら、それは

少なくとも[-1、1,000,000]の範囲の値を格納できる符号付き積分型。

これは、システム上でとして定義されている可能性があることを意味intします。フォーマット文字列からlong指定子を削除しlて、通常の10進数として出力してみてください。

編集

rraの答えによると、これは移植性がありません。suseconds_t同じ方法で定義するシステムでのみ機能します。仕様から、タイプは少なくとも32ビットの符号付き積分タイプであることがわかります。最も移植性の高い方法は、それを、回避できる最大の符号付き積分組み込み関数にキャストすることです。

于 2013-03-18T01:50:12.563 に答える