0

根据标准,mktime应该执行规范化 - 当您想添加一分半钟时struct tm,您添加 90 秒tm_sec并调用mktime,忽略它的返回值。

我在标准中没有找到的是,即使参数无法表示time_t(例如将年份设置为 2100),参数是否已标准化。

那么,这段代码安全吗?

struct tm future;
memset(&future, 0, sizeof(future));
future.tm_mon = 1;
future.tm_sec = 90;   //I want this to be normalised by mktime
future.tm_year = 200; //but this can cause troubles

mktime(&future);

//future.tm_sec should be 30
//future.tm_min should be 1
//future.tm_year should be still 200
4

2 回答 2

1

您需要检查mktime. 您不应该忽略库函数的返回值!(除了printf和(不是这样)少数其他人)。

如果它返回(time_t)-1结果是不可信的。

请参阅http://codepad.org/KTZwUHt0上的示例

在我的电脑上打印相同的代码

time_t 是 64 位长
标准化为 2100-01-31 T 00:01:30
于 2011-11-05T22:47:03.543 回答
1

C标准有这样的说法mktime()

成功完成后tm_wday,结构的和组件的值tm_yday被适当设置,其他组件被设置为表示指定的日历时间,但它们的值被强制为上述范围;的最终值在确定tm_mday之前不会设置。tm_montm_year

因此,如果函数成功完成,您只能依赖正在执行的规范化。

于 2011-11-06T08:52:06.410 回答