为什么union*和struct*之间可能存在差异?

Ded*_*tor 5 c struct pointers unions language-lawyer

C标准要求所有指向unions的指针具有相同的表示和对齐要求.
对于指向structs的所有指针,它都要求相同.

因此我的问题是:
为什么标准没有强制指向unions的指针具有与s 指针相同的表示和对齐要求struct(我非常感谢一个利用这个实现的实现的例子.)
或者我只是错过了相关的文本?

标准草案n1570(C11最终草案)的相关引用:

6.2.5类型§28

指针void应具有与指向字符类型的指针相同的表示和对齐要求.48)类似地,指向兼容类型的合格或非限定版本的指针应具有相同的表示和对齐要求.所有指向结构类型的指针都应具有相同的表示和对齐要求.所有指向union类型的指针都应具有相同的表示和对齐要求.指向其他类型的指针不需要具有相同的表示或对齐要求.

Kei*_*son 5

无论是1989 ANSI C的理由,也不是ISO C99理由讨论这一点.

我怀疑缺乏这样的要求是有充分理由的.可能委员会不想强加不必要的严格要求.我也怀疑是否存在任何实际的实现,其中指向结构的指针和指向联合的指针没有相同的表示.

例如,考虑一个结构可以包含一个联合成员,反之亦然,因此实现使用不同的表示可能没有充分的理由 - 标准也没有任何理由要求所有实现使用相同的表示.

所有结构指针"闻起来都很相似"的原因是允许使用指向不完整类型的指针.例如:

struct foo;

void func(struct foo *param);

struct foo { /* member declarations */ };
Run Code Online (Sandbox Code Playgroud)

struct foo除了struct知道如何生成调用的类型之外,编译器不必了解任何其他内容func().

这同样适用于不完整的联合类型.但是不完整的结构类型不能作为联合完成,反之亦然,因此能够假设它们具有相同的表示没有很大的好处.