c - ab 总是 (&a)->b 吗?
问题描述
在 C 语言中,a.b
通常是 的同义词(&a)->b
。
这在绝对所有情况下都是正确的,即使a
是一些杂乱复合术语的宏?或者在任何版本的 C 中是否存在等价不成立的边缘情况?
解决方案
以下是三个反例,均基于应用的约束&
:
a
是一个右值,因为它是一个函数返回的结构:
Clang 说“错误:不能获取 'struct S' 类型的右值的地址”。但它接受int bar(void) { extern struct S { int b; } foo(void); return (&foo())->b; }
return foo().b;
。a
是一个右值,因为它是赋值的结果:
Clang 说“错误:不能获取 'struct S' 类型的右值的地址”。但它接受int bar(void) { struct S { int b; } x = {0}; struct S y; return (&(y=x))->b; }
return (y=x).b;
。a
用 声明register
,因此它的地址可能不会被采用:
Clang 说“错误:请求的寄存器变量地址”。int bar(void) { register struct S { int b; } a = {0}; return (&a)->b; }
推荐阅读
- java - 将复选框绑定为要添加到
- 作为父对象的字段,传递给数据库
- user-interface - 如何安装 opengl 以使其运行
- swift - 具有多个键和关联值的可编码枚举
- python-3.x - 如何在python中生成随机数?
- python - 如何将 3D 数组转换为 argmax 的 2D 数组?
- python - Python 根据往年可用的相同日期填充缺失值
- angular - 在 Http 主机不工作的情况下获取用户位置
- c# - 在 Lambda 表达式 C# 中更改内部选择值
- android-studio-3.5 - 为什么应用更改功能仅适用于 android studio 3.5 中 API 26 及更高版本的设备
- c - cudaSetDevice() 编号是否跨进程一致?