错误:需要左值作为一元&操作数

25

在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上编译成功。

为什么会这样?如何纠正这个问题?


1
可能值得指定编译器的版本(gcc?)而不是操作系统版本。 - anatolyg
编译时出现错误 @gcc 版本 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)。 - Rahul_cs12
2个回答

35
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_tu32_Time 的类型不兼容,那么这样您将获得必要的警告和/或错误。

我强烈建议不要使用 C 式转换,因为一旦您需要将此代码移植到另一个平台,您将无法轻松找到那个讨厌的转换。


15

最好从错误的含义开始讲起。"lvalue"是出现在等号左边的东西。这意味着你传递给"address of"运算符(&)的参数必须是可以被赋值的。在你的情况下,以下语法是不正确的:

(long)u32_Time = 0;

限制之所以存在是因为 & 运算符返回存储在某个位置上的内容的地址。 (long)u32_Time 并没有被存储在任何地方,但 u32_Time 被存储了。在更寬容的编译器上,这可能有效,因为它会为 u32_Time 的 long 表示分配一些空间,然后给你指向该空间的指针,但我不会保证这种方法能够正常运行(如 Linux Server release 6.1 中所示)。要解决这个问题,你可以只需创建一个新变量并取它的地址即可:
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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接