C 为什么撤销指向外部联盟的指针是未定义的?

C 为什么撤销指向外部联盟的指针是未定义的?,c,pointers,unions,c89,C,Pointers,Unions,C89,我有以下代码。为什么以以下方式取消联合指针的定义是不明确的 extern union MyUn *P1; extern union MyUn *P2; extern void myfunc(void) { *P1 = *P2; } 如果您还没有在此源文件中定义union,则编译器不知道要复制多少 联合的大小是多少?这与联合无关,也不是“未定义的”:如果您试图取消引用指向不完整类型的指针(出于明显的原因),这只是一个编译器错误。如

我有以下代码。为什么以以下方式取消联合指针的定义是不明确的

extern union MyUn *P1;          
extern union MyUn *P2;

extern void myfunc(void)
{
      *P1 = *P2;                
}

如果您还没有在此源文件中定义union,则编译器不知道要复制多少


联合的大小是多少?

这与联合无关,也不是“未定义的”:如果您试图取消引用指向不完整类型的指针(出于明显的原因),这只是一个编译器错误。

如果当时不知道联合,那么
*P1
*P2
不是不完整类型吗?因此,取消引用本身是不正确的。是的,不完整的
struct
union
类型的主要问题是它们的大小未知(并且包含未知成员)。简单的编译器错误意味着违反了约束,不是吗:)