c - C 编译器 (clang) 如何强制执行 const?
问题描述
使用 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 输出与在该调用中替换它是一致的1.234
;这是合法的,因为不允许更改。x
printf
x
推荐阅读
- csv - 如何使用查询命令将弹性搜索所有记录放入 csv 文件
- python - 关于 O(LogN) 的时间复杂度
- java - weblogic证书导入问题
- python - 在模块末尾分配的变量
- javascript - 如何在 php 中创建干净的 url 从 mysql 获取数据?
- arrays - 致命错误:索引超出范围?但真的吗?
- entity-framework-6 - Entity Framework (v6) Eager-Loading 奇怪的行为 - 'Gotcha'
- javascript - 括号中的正则表达式匹配数(Firefox)
- java - 为什么这加起来是 11 而不是 8?
- nginx - Nginx access_log 的路径可以带变量吗?