c - C标准:结构和联合说明符:“适当转换”的确切定义是什么?
问题描述
N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E)(已添加重点):
6.7.2.1 结构和联合说明符
17 在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。
18 工会的规模足以容纳其最大的成员。任何时候最多可以将其中一个成员的值存储在联合对象中。一个指向联合对象的指针,经过适当的转换,指向它的每个成员(或者如果一个成员是一个位域,那么指向它所在的单元),反之亦然。
问题: 的确切定义是suitably converted
什么?
额外:如果没有确切的定义suitably converted
,那么 C 实现应该记录它的理解吗?例如(C/C++ 预处理器域),微软将术语single item
(C++,N4713)理解为single, permanently indivisible preprocessor token
(这会导致从 gcc/clang/other 移植代码时出现问题,这有不同的理解),但是,他们似乎没有记录他们对single item
.
解决方案
在这种情况下,“适当的转换”意味着转换为适当的兼容类型。例如:
#include <stdio.h>
struct mystruct {
double a;
int b;
};
int main()
{
struct mystruct s = { 2.5, 4 };
double *d = (double *)&s;
printf("%f\n", *d); // prints 2.500000
return 0;
}
这里的第一个成员struct mystruct
has type double
。因此,在这种情况下,“合适的转换”意味着 astruct mystruct *
可以通过显式转换转换为double *
,并将指向该a
成员。
推荐阅读
- php - 我在使用 cURL 登录我的 wordpress 网站时遇到问题
- scala - Spark - 如何处理更新
- robotframework - 将列表传递给机器人框架中的 python 库
- tesseract - 从图片中获取 Tesseract 中的空结果,但从上述图片的屏幕截图中获得了良好的结果
- python - Pandas 将日期时间对象类型转换为日期时间
- mysql - MySQL trigger after update to insert in audit table
- python-3.x - 如何使用 Ansible 2.9.2 python API 执行任务?
- java - 如何在 Kotlin/Java 中对 Numpy 数组(Python)进行 base64 解码?
- go - go中使用channel实现重试机制
- intellij-idea - IntelliJ : How to Fix "Code segment has wrong length in class file"