首页 > 解决方案 > 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.

标签: cstructlanguage-lawyerunionsc17

解决方案


在这种情况下,“适当的转换”意味着转换为适当的兼容类型。例如:

#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 mystructhas type double。因此,在这种情况下,“合适的转换”意味着 astruct mystruct *可以通过显式转换转换为double *,并将指向该a成员。


推荐阅读