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
类型的主要问题是它们的大小未知(并且包含未知成员)。简单的编译器错误意味着违反了约束,不是吗:)