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

Rah*_*s12 9 c++ linux

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

strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
Run Code Online (Sandbox Code Playgroud)

得到错误"错误:左值需要作为一元'和'操作数'

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

为什么这样?怎么纠正这个?

Arn*_*rtz 19

地址运算符&需要一个变量来获取地址.你的演员的结果(long)u32_Time是一个临时的,不一定存在于内存中,因此没有可以采取的地址.因此,如果那段代码曾在某处编译过,那么它就是一个非标准的编译器扩展.

标准§5.3.1,3要求:

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

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

 localtime(reinterpret_cast<std::time_t*>(&u32_Time));
Run Code Online (Sandbox Code Playgroud)

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

 std::time_t time = u32_Time;
 localtime(&time);
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

最好从错误的含义开始."左值"是出现在等号左侧的东西.这意味着您对"地址"运算符(&)的参数必须是您可以分配的内容.在您的情况下,这在语法上是不正确的:

(long)u32_Time = 0;
Run Code Online (Sandbox Code Playgroud)

这种限制的原因是&运算符返回存储在某处的东西的地址.(长)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));
Run Code Online (Sandbox Code Playgroud)

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

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