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 说“错误:请求的寄存器变量地址”。