【发布时间】:2015-07-01 09:12:09
【问题描述】:
我写了一个简单的定时器函数来计算start和end之间经过的时间
double mytimer(struct timeval *start, struct timeval *end)
{
return (end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec)*1e-6;
}
gcc 给出以下警告:
警告:从“__suseconds_t”转换为“double”可能会改变其值
警告:从“__time_t”转换为“double”可能会改变其值
这里是timeval的定义:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
所以我的问题是,为什么 C 定义了这么多 incompatible 类型,而不是简单地使用原始类型,例如 int short ...?这根本不是用户友好的。
我怎样才能对这些类型进行算术运算?
更新
你们中的大多数人似乎都忽略了我的第二个问题。添加time_t和suseconds_t等两种不同类型的标准方法是什么?
【问题讨论】:
-
suseconds_t可能类似于std::size_t.. 或其他无符号类型。 -
正是为了防止用户朝自己的脚开枪,正如您很乐意尝试做的那样。从长远来看,它是非常用户友好的,因为你花在调试上的时间要少得多:如果你的程序不正确,它甚至不会编译,编译器会告诉你原因。跨度>
-
谢天谢地,您从未听说过 C# (.NET) 或 Haskell 之类的语言:}
-
"仅仅使用基本类型,例如
intshort..."int和short不一定大到足以存储实现的范围tv_sec值。如果tv_sec是一个 64 位值,那么警告您在转换为double时可能会丢失精度是否合理且可能有用?而且它们不一定是“这么多不同的类型”——它们可能是typedefs 对于更简单、熟悉的类型,但编译器会显示typedef名称,因为它通常提供更多信息。 -
the C standard 在哪里定义
suseconds_t,作为不完整类型 还是其他?
标签: c type-conversion