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

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

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

得到错误“错误:左值需要作为一元”&“操作数”

但是红帽企业Linux AS版本3成功编译了相同的代码。

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

地址运算符&需要一个变量来取地址。 你的演员(long)u32_Time是一个临时的,不一定驻留在内存,因此没有地址可以采取。 所以如果这段代码在某个地方编译过,那么这是一个非标准的编译器扩展。

标准§5.3.1,3要求:

一元&运算符的结果是一个指向其操作数的指针。 操作数应该是一个左值[…]

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

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

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

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

这样,如果time_tu32_Time的类型不兼容,您将获得必要的警告和/或错误。

我强烈建议不要使用C-casts,因为一旦你不得不将这段代码移植到另一个平台上,你将无法轻松地找到这个恶意的cast。

从错误的意思开始,最好的做法是开始。 “左值”是出现在等号左侧的东西。 这意味着你对“地址”运算符(&)的参数必须是你可以分配的东西。 在你的情况下,这在语法上是不正确的:

 (long)u32_Time = 0; 

这个限制的原因是&运算符返回某处存储的东西的地址。 (长)u32_Time不存储在某个地方,但u32_Time是。

这可能在更宽容的编译器上工作正常,因为它会为u32_Time的长表示分配一些空间,然后给你一个指针,但是我不会指望它工作(在Linux服务器版本6.1中可以看到) 。

要解决这个问题,你可以创建一个新的变量,并将其作为地址:

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

但是,这还不够完美。 本地时间期望一个time_t指针,而不是一个长指针,虽然他们可能在你的平台上是相同的,你会更好:

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