编译时(使用Linux Server版本6.1)
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
得到错误"错误:左值作为一元'&'操作数"
但是使用Red Hat Enterprise Linux AS第3版成功编译了相同的代码。
为什么这样?如何纠正这个?
答案 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_t
与u32_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));