首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打印结构timeVal

如何打印结构timeVal
EN

Stack Overflow用户
提问于 2013-03-18 09:42:40
回答 3查看 11.6K关注 0票数 2

我的代码中有这一行

代码语言:javascript
复制
`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的警告

代码语言:javascript
复制
`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.hsys/time.h

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-18 09:56:59

将数字转换为正确的类型:

代码语言:javascript
复制
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));
票数 2
EN

Stack Overflow用户

发布于 2013-03-18 09:55:57

struct timeval的成员类型会因系统而异。与许多其他C数据类型一样,安全和可移植的做法是在打印时强制转换值:

代码语言:javascript
复制
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。而且我还没有见过需要处理这些时间值的实现。

票数 2
EN

Stack Overflow用户

发布于 2013-03-18 09:50:13

有关suseconds_t的解释,请参阅sys/types.h。很明显,是这样的

一个带符号的整数类型,它至少能够存储- 1,000,000范围内的值。

这意味着它可能在您的系统上定义为int。尝试从格式字符串中删除长说明符l,并将其打印为常规小数。

编辑

根据rra的回答,这将不是可移植的。它只能在以相同方式定义suseconds_t的系统上工作。我们从规范中了解到该类型是至少32位的带符号整数类型。最可移植的方式是将其转换为您可以逃脱的最大的有符号整数内在函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15468564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档