在Linux服务器发布版本6.1上编译时
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
遇到错误 "error: lvalue required as unary '&' operand"。
但是相同的代码在Red Hat Enterprise Linux AS release 3上编译成功。
为什么会这样?如何纠正这个问题?
在Linux服务器发布版本6.1上编译时
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
遇到错误 "error: lvalue required as unary '&' operand"。
但是相同的代码在Red Hat Enterprise Linux AS release 3上编译成功。
为什么会这样?如何纠正这个问题?
std::time_t time = static_cast(u32_Time);
localtime(reinterpret_cast<std::time_t*>(&u32_Time));
更加便携的方法是首先将值存储在正确的数据类型中:
std::time_t time = u32_Time;
localtime(&time);
如果 time_t
和 u32_Time
的类型不兼容,那么这样您将获得必要的警告和/或错误。
我强烈建议不要使用 C 式转换,因为一旦您需要将此代码移植到另一个平台,您将无法轻松找到那个讨厌的转换。
最好从错误的含义开始讲起。"lvalue"是出现在等号左边的东西。这意味着你传递给"address of"运算符(&)的参数必须是可以被赋值的。在你的情况下,以下语法是不正确的:
(long)u32_Time = 0;
long long_Time = (long)u32_Time;
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&long_Time));
但是,这还不够完美。localtime函数需要一个time_t指针,而不是long指针,虽然在您的平台上它们可能相同,但最好使用:
time_t time_t_Time = (time_t)u32_Time;
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&time_t_Time));