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

时间:2014-04-01 13:54:07

标签: c++ linux

编译时(使用Linux Server版本6.1)

strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));

得到错误"错误:左值作为一元'&'操作数"

但是使用Red Hat Enterprise Linux AS第3版成功编译了相同的代码。

为什么这样?如何纠正这个?

2 个答案:

答案 0 :(得分:19)

地址操作符&需要一个变量来获取地址。您的强制转换(long)u32_Time的结果是一个临时的,不一定存在于内存中,因此没有可以使用的地址。因此,如果那段代码曾在某处编译过,那么它就是一个非标准的编译器扩展。

标准§5.3.1,3要求:

  

一元&的结果operator是指向其操作数的指针。操作数应为左值[...]

如何解决此问题 std::localtime需要一个指向std::time_t的指针,以便您最好提供。你没有提供任何解释或进一步的代码,所以我只能猜测u32_Time是一个4字节无符号算术类型,它应该以某种方式表示时间。如何将其正确转换为std::time_t取决于编译器如何实现后者以及如何获得更远的值。简单地应用C-cast是便携式,而且long的投射更不便携。
当且仅当当前平台上的std::time_t 也是使用与u32_Time相同的无符号32位类型时,它可能会足以使用

 localtime(reinterpret_cast<std::time_t*>(&u32_Time));

更便携将首先将值存储在正确的数据类型中:

 std::time_t time = u32_Time;
 localtime(&time);

如果time_tu32_Time的类型不兼容,您将收到必要的警告和/或错误。

我强烈建议不要使用C-casts,因为一旦你必须将这段代码移植到另一个平台,你将无法轻易找到那个令人厌恶的演员。

答案 1 :(得分:6)

最好从错误的含义开始。 &#34;左值&#34;是出现在等号左侧的东西。这意味着你对&#34;&#34;地址的论证? operator(&amp;)必须是您可以分配的东西。在你的情况下,这在语法上是不正确的:

(long)u32_Time = 0;

这种限制的原因是&amp; operator返回存储在某处的东西的地址。 (长)u32_Time不存储在某处,但是u32_Time是。

这可能对更宽容的编译器有效,因为它会为u32_Time的长表示分配一些空间,然后给你一个指向它的指针,但我不会指望那个工作(如可以看到的那样) Linux Server版本6.1)。

要解决此问题,您只需创建一个新变量并改为使用它的地址:

long long_Time = (long)u32_Time;
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&long_Time));

然而,这仍然不完美。 localtime需要一个time_t指针,而不是一个长指针,虽然它们在你的平台上可能是相同的,但你最好还是选择:

time_t time_t_Time = (time_t)u32_Time;
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&time_t_Time));