【发布时间】:2021-10-20 16:44:33
【问题描述】:
我最近在看ISO/IEC 9899:2017,下面是源链接 https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
让我感到困惑的是以下语句,因为标准说它不是有效的片段(因为联合类型在函数 f 中不可见)。 但是当我运行这段代码时,我得到了正确的返回值。
#include <stdio.h>
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 U{
struct t1 s1;
struct t2 s2;
} u = {-1};
return f(&u.s1, &u.s2);
}
int main(){
int i = g();
printf("%d\n",i);
}
所以我的问题是: 是否有效解析联合成员的指针,该成员是在文件范围内定义的结构,指向另一个联合类型不可见的函数?
【问题讨论】:
-
一个工会一次不能有多个活跃成员。函数
f(以后请复制粘贴所有文本作为文本到您的问题中)使用两个成员,因为它们同时处于活动状态。这会导致未定义的行为。 -
在问题本身中将与问题相关的任何代码显示为(代码格式的)文本。不要链接代码或其他文本的图像。
-
感谢以上建议,我已将我的代码以文本格式呈现。
-
最近有一些关于此的问题,我可以尝试查找,讨论一些对标准的建议修复,这些修复并不真正令人满意且从未实施。是的,请参阅 stackoverflow.com/questions/68963247/… 和 stackoverflow.com/questions/22897037/…。
标签: c