我的代码中有这一行
`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 -I包括time.h和sys/time.h
发布于 2013-03-18 09:56:59
将数字转换为正确的类型:
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-18 09:55:57
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-18 09:50:13
有关suseconds_t的解释,请参阅sys/types.h。很明显,是这样的
一个带符号的整数类型,它至少能够存储- 1,000,000范围内的值。
这意味着它可能在您的系统上定义为int。尝试从格式字符串中删除长说明符l,并将其打印为常规小数。
编辑
根据rra的回答,这将不是可移植的。它只能在以相同方式定义suseconds_t的系统上工作。我们从规范中了解到该类型是至少32位的带符号整数类型。最可移植的方式是将其转换为您可以逃脱的最大的有符号整数内在函数。
https://stackoverflow.com/questions/15468564
复制相似问题