c - C 编译器 (clang) 如何强制执行 const?

标签 c constants

使用 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/

相关文章:

c - 为什么这个简单的循环在 Go 中比在 C 中更快?

objective-c - Obj-C 中的 NSNumber 常量

C++ 和 Swift 彼此不喜欢

c# - 将属性名称存储在公共(public)常量字符串中是一种好习惯吗?

c - 如何将 printf() 函数与自适应类型一起使用?

c - 我的代码有什么问题?该程序只是终止而没有错误声明

c - C中的字符串连接

c++ - 将 lambda 转换为 std::function 时强制执行常量正确性

c - 我很困惑的基本 C 指针声明和指针变量

c - 有效地添加可被 3 或 5 整除的数字