【问题标题】:Why gcc and clang compiles to different "const" result for my program?为什么 gcc 和 clang 为我的程序编译成不同的“const”结果?
【发布时间】:2017-07-08 12:20:56
【问题描述】:

我正在使用 gcc 和 clang 测试 .c 和 .cpp 下“const”关键字的行为。

#include<stdio.h>
int main(){
    const int i=1;
    int *pi = (int *)(&i);
    *pi = 2;
    printf("i = %d *pi = %d\n",i,*pi);
    const int j=i;
    printf("j = %d\n", j);
    return 0;
}

使用不同的编译器会导致不同的结果:

$gcc testConst.c && ./a.out
i = 2 *pi = 2
j = 2

$clang testConst.c && ./a.out
i = 1 *pi = 2
j = 1

如果我把文件从.c改成.cpp,然后用g++编译运行,结果和clang版本一样

$g++ testConst.cpp && ./a.out
i = 1 *pi = 2
j = 1

我想知道:

  1. 'const' 在 C 和 C++ 中的含义有点不同,所以相同编译器 gcc 的结果会导致不同的结果吗?
  2. 编译同一个 .c 文件,gcc 和 clang 有不同的结果,这是正确的,还是未定义的行为?任何可以解释这一点的 C/C++ 标准语句?

【问题讨论】:

  • 修改 const 变量是 UB。这也被问过很多次了。

标签: c++ gcc casting clang constants


【解决方案1】:

修改const 变量是未定义的行为。甚至可能是这样的:

*pi = 2;

将整数设置为 9999。否则程序会崩溃。

即使你编译了程序,如果你运行它四次并得到四种不同的结果,你也没有资格抱怨。这就是未定义行为的美妙之处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2021-09-25
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多