【问题标题】:error: lvalue required as unary & operand错误:需要左值作为一元和操作数
【发布时间】:2014-04-01 13:54:07
【问题描述】:

编译时(使用 Linux Server 6.1 版)

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

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

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

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

【问题讨论】:

  • 可能值得指定编译器的版本(gcc?)而不是操作系统版本
  • 在编译 @gcc 版本 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) 时出现错误

标签: c++ linux


【解决方案1】:

地址运算符& 需要一个变量来获取地址。您的演员 (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 相同的表示形式,使用它可能就足够了

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

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

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

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

我强烈建议不要使用 C-casts,因为一旦您必须将这段代码移植到另一个平台,您将无法轻松找到该讨厌的演员表。

【讨论】:

    【解决方案2】:

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

    (long)u32_Time = 0;
    

    这种限制的原因是 & 运算符返回存储在某处的东西的地址。 (long)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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2011-03-04
      相关资源
      最近更新 更多