ab 总是 (&a)->b 吗?

rwa*_*ace 11 c pointers language-lawyer

在 C 中,a.b通常与 同义(&a)->b

这绝对在所有情况下都是正确的,即使a是一些杂乱复合术语的宏?或者在任何版本的 C 中是否存在任何边缘情况,其中等价性不成立?

Eri*_*hil 14

以下是三个反例,均基于对 apply 的约束&

  • a 是一个右值,因为它是一个函数返回的结构:
    int bar(void)
    {
        extern struct S { int b; } foo(void);
        return (&foo())->b;
    }
    
    Run Code Online (Sandbox Code Playgroud) Clang 说“错误:无法获取类型为 'struct S' 的右值的地址”。但它接受return foo().b;.
  • a 是一个右值,因为它是赋值的结果:
      int bar(void)
      {
          struct S { int b; } x = {0};
          struct S y;
          return (&(y=x))->b;
      }
    
    
    Run Code Online (Sandbox Code Playgroud) Clang 说“错误:无法获取类型为 'struct S' 的右值的地址”。但它接受return (y=x).b;.
  • a用 声明register,所以它的地址可能不被采用:
    int bar(void)
    {
        register struct S { int b; } a = {0};
        return (&a)->b;
    }
    
    Run Code Online (Sandbox Code Playgroud) Clang 说“错误:请求的寄存器变量地址”。


Kei*_*son 11

a.b,a不需要是左值。

例如,如果a是一个扩展为函数调用的宏,那么(&a)->b就是一个约束冲突。