使用 Clang,以下内容:
#include <stdio.h>
int main(void)
{ double const x = 1.234;
double *p = (double *) &x;
/* Same with double *p = &x; but with a mere warning from clang
Clang++ does raise an error in this case.
*/
*p = 5.678;
printf("*p = %f\n", *p);
printf(" x = %f\n", x);
if (&x == p) {
printf("&x = %p\n", &x);
printf(" p = %p\n", p);
}
return 0;
}
给出输出:
*p = 5.678000
x = 1.234000
&x = 00000080288FFEA8
p = 00000080288FFEA8
编译器究竟是如何做到这一点的?编译器如何才能成功编译 和 避免以下输出:
*p = 5.678000
x = 5.678000
&x = 00000080288FFEA8
p = 00000080288FFEA8
最佳答案
通过删除 const
的转换修改最初为 const
的对象的行为是未定义的。
编译器是否警告您未定义的行为取决于编译器。完全笼统地这样做是不可能的。
优化编译器会根据您的程序不包含未定义行为这一事实做出假设。 Clang 输出与在 printf
调用中用 1.234
替换 x
一致;这是合法的,因为不允许更改 x
。
关于c - C 编译器 (clang) 如何强制执行 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729517/