首页 > 解决方案 > ab 总是 (&a)->b 吗?

问题描述

在 C 语言中,a.b通常是 的同义词(&a)->b

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

标签: cpointerslanguage-lawyer

解决方案


以下是三个反例,均基于应用的约束&

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

推荐阅读