【发布时间】:2021-09-01 09:55:04
【问题描述】:
注意:学习严格的别名规则。请耐心等待。
代码示例(t935.c):
#include <stdio.h>
int f(int* pi, double* pd)
{
*pi = 13;
*pd = 7E-323;
return *pi;
}
int main(void)
{
union { int i; double d; } u;
printf("%d\n", f(&u.i, &u.d));
return 0;
}
调用:
$ gcc t935.c -Wall -Wextra -std=c11 -pedantic && ./a.exe
14
$ gcc t935.c -Wall -Wextra -std=c11 -pedantic -O2 && ./a.exe
13
$ gcc t935.c -Wall -Wextra -std=c11 -pedantic -O2 -fno-strict-aliasing && ./a.exe
14
问题:将两个指向同一个联合成员的指针传递给函数是否违反了严格的别名规则?
UPD20210901
如果在全局范围内定义联合类型会发生什么?
对于“union u is defined in global scope”(实际上是 file 范围)情况,gcc 和 clang 显示的结果与上面报告的 gcc 相同。
【问题讨论】:
-
是的。 union 在
f()的体内是不可见的,如果union类型是在全局范围内定义的会发生什么? -
@tstanisl 不确定工会的范围为何或如何对此有任何影响。该函数只看到两个指针,并分别使用它们:它们指向“相同”的地方是无关紧要的,不是吗?
-
标准中有一个关于联合可见性和严格别名规则的微妙之处,请参阅gcc.gnu.org/bugzilla/show_bug.cgi?id=65892
-
@NateEldredge 感谢您提供信息!有趣。
标签: c pointers constraints c11 strict-aliasing