我正在使用struct timespec
结构,这里是:
struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ };
事情是,用户将input每个这些个人成员的价值观,我想把一个检查最大。 用户可以input的值。
我可以采取最大限度吗? time_t
值作为int最大值? 即INT_MAX
为tv_sec
和LONG_MAX
(在limits.h中定义)为tv_nsec
? 两者的最小可接受值是多less? 它是零吗? 我猜负值不能被接受? 只要添加,这些值将在计时器中使用。
PS: time_t
的typedef在哪里? 在time.h中找不到它。
time_t只是一个很长的int。
它在(在我的Ubuntu linux系统上)/usr/include/time.h中定义,然而定义一直延伸到/usr/include/bits/types.h,其中__SLONGWORD_TYPE
(这是__TIME_T_TYPE
被定义的)被定义为。
简单地检查一个值是否大于LONG_MAX
是,一旦一个值超过这个值,它将自动回绕并变成负值。 因此,你不能检查是否有任何东西大于这个值 – 宏被定义为这个类型可以使用的最大值。
你不是真的想要一个用户输入这些值 – 除非通过“用户”你的意思是“开发人员”。 唯一真正的“安全”的方式来测试这将是让用户输入一个字符串(当然是c样式),然后运行两个检查:
1)检查用户输入的数字是否超过允许的数字(便宜的技巧是int(log10(number)) + 1
来计算一个数字中的数字的数量)。
2)如果这等于数字的数量,则开始比较数字。 您可以使用一点模运算来逐位比较。
这确实是最安全的方式来检查用户是否输入一个太大的数字。 这种方式不会遇到任何溢出问题,尽管这是非常乏味的。 希望这可以帮助。
由于这里的人正在回答如何设置最大time_t
值,并进一步猜测它的类型,我想我会添加c++
方式来做到这一点:
#include <limits> ... time_t maxTime = std::numeric_limits<time_t>::max();
我不会在意什么是时间,而是关于什么是合理的。 在我看到的任何系统中, time_t
都可以对63到10 11年间的时间段进行编码(几乎每个我知道的系统都使用64位数字,因为这些天才们在1999年提出了2000年世界末日的事情,当2038年过去时,谁将注意到更大的“事件”仍有待观察)。
如果您合理地期望您的程序运行时间不超过50年,拒绝大于50 * 365 * 86400的任何值,或者只是将该值饱和。 我不希望我现在写的任何程序在50年内被使用(虽然我不会去验证)。
另一方面,如果你的系统使用了32位的time_t
,那么无论如何也不重要,因为系统时间在50年之内都会翻倍,所以无论如何也不能构建一个有意义的时间。
如果你问“你想暂停多久?” 而用户说“250年”,如果你说“是的,50也会做”,我认为这不是真正的错误的程序行为。 因为,嘿,差别真的不可观察。
根据维基百科, time_t
可能是一个整数或浮点数,但通常是一个32位或64位有符号整数。 我认为您可以假设的最大安全值是INT_MAX
。 对于time_t
,至少负数是合法的,并在1970年1月1日之前提及。
取自ISO / IEC 9899: TC3§7.23
声明的类型是
size_t
(在7.17中描述);clock_t
和time_t
,它们是能够表示时间的算术类型; 和struct tm
,它包含一个日历时间的组成部分,称为分解时间。
clock_t
和time_t
中表示的时间的范围和精度是实现定义的
因此,您不能根据C标准对其最大值进行任何假设。
如果你需要编写可移植的代码,你可能会使用autotols。 Autoconf提供了AC_CHECK_SIZEOF宏,可以帮助您处理体系结构特定的数据限制。
不幸的是,ISO C标准(目前是C11)没有提供任何方式来获得time_t
的最大值。 因此,除非使用像Autoconf这样的工具来提供信息,否则需要做一些假设。
假设time_t
是一个没有填充位的整型(现在大多数平台都是这种情况,如果不是全部的话),可以这样做:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
这是有符号整数类型的最大可表示值(但time_t
中的值可表示的事实并不意味着它被系统支持为time_t
值)。
人们也可能想要检测time_t
是否是整数类型。 ISO C标准规定time_t
是一个真正的类型(条款7.27.1)。 根据定义, 真实类型可以是整数类型,也可以是实际浮点类型 ( 浮点型 , double
float
型或long double
float
型 ,可能还有其他版本,如标准6.11.1所述)。 因此,如果time_t
不是整数类型,它必然是一个真正的浮动类型。 因此,可以使用test (time_t) 1 / 2 == 0
来检测time_t
是否为整型。
注意:如果T
是一个浮点类型,C标准并没有严格要求(T) 1 / 2
等于0,但是如果不是这样的话,我怀疑这样的平台在浮点计算上会有严重的问题。