【发布时间】:2019-03-01 21:17:57
【问题描述】:
当我阅读 ISO/IEC 9899:1999(参见:6.5.2.3)时,我看到了一个这样的例子(强调我的):
以下是不是有效片段(因为联合类型在函数
f中不可见):struct t1 { int m; }; struct t2 { int m; }; int f(struct t1 * p1, struct t2 * p2) { if (p1->m < 0) p2->m = -p2->m; return p1->m; } int g() { union { struct t1 s1; struct t2 s2; } u; /* ... */ return f(&u.s1, &u.s2); }
我在测试时没有发现任何错误和警告。
我的问题是:为什么这个片段无效?
【问题讨论】:
-
f可以假设p1 != p2因为它们指向不同的类型。并进行优化 - 读取寄存器中的p1->m值并返回此寄存器。它假定p2->m = -p2->m不修改p1->m出了什么问题。 union 这里的唯一方法是使 p1==p2 -
我冒昧地将图像转录成文字,希望我没有打错字。原件在编辑历史中可见:stackoverflow.com/revisions/52511896/1
-
请注意,有许多无效程序可以干净地编译。事实上,C 标准中有这么多关于什么是有效、无效、UB、...的文本的原因是因为你不能依赖编译器来简单地检测和拒绝它们
-
简单修复...在第一个函数之前定义联合