首页 > 解决方案 > 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

标签: cconstants

解决方案


修改最初const通过删除const未定义的强制转换的对象的行为。

编译器是否警告您未定义的行为取决于编译器。完全笼统地这样做是不可能的。

优化编译器将基于您的程序不包含未定义行为的事实做出假设。Clang 输出与在该调用中替换它是一致的1.234;这是合法的,因为不允许更改。xprintfx


推荐阅读