如何正确地将 time_t 转换为 long int?

How to correctly cast time_t to long int?

我仍在学习 C++ 中的类型转换,我目前正在这样做

long int t = time(NULL);

我正在使用 VS2013 并注意到从 'time_t' 到 'long' 的转换警告,所以我想我会输入强制转换它看起来像;

long int t = static_cast<long int> time(NULL);

然而,这还行不通,但结合静态转换和 C 风格转换仍然有效

long int t = static_cast<long int> (time(NULL));

我只是想知道是否有人可以帮助阐明这一点?

time(NULL) 不是强制转换,而是 returns time_t 的函数调用。由于 time_tlong int 的类型不完全相同,您会看到警告。

此外,static_cast<T>(value) 需要括号,这就是为什么您的第一个版本不起作用的原因。

A time_t 值是自 1970 年 1 月 1 日开始以来的秒数。将其转换为 32 位 long 因此您将自己限制为表示时间值的值 before the year 2038 , 大致。这不是一个好主意,它的缺点是你发出警告的原因。


尝试表达

static_cast<long int> time(NULL)

只是无效的语法。 static_cast 需要带括号的值。

您的问题包含答案。您提供的代码中的 static_cast 泛型方法将 time_t 类型作为其输入并将其转换为 long int 作为其 return 值。此代码不包含 C 风格的类型转换。

long int t = static_cast<long int> (time(NULL));

类型转换也应该有效,因为 time_t 是算术类型,C 转换运算符将执行到 long int 类型的提升。

long int t = (long int)time(NULL);

这篇 casting tutorial 对您来说可能是一本有趣的读物。