gpt4 book ai didi

c++ - 这在警告级别 4 的 VC9 中编译时没有警告。为什么有人不认为这是编译器缺陷?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:45 28 4
gpt4 key购买 nike

我看到一些已发布的代码在 SO 上出现超出范围的错误,这让我感到奇怪。我希望编译器为此代码生成警告(至少在最高级别)

#pragma warning(push,4)
int main(){
int x[2];
x[2]=0;
return 0;
}
#pragma warning(pop)

但事实并非如此。

EDG 编译器很好地说:

"sourceFile.cpp", line 3: warning:
subscript out of range
x[2]=0;
^

其实EDG说的有点多(都是意料之中的)

"sourceFile.cpp", line 1: warning: 
unrecognized #pragma
#pragma warning(push,4)
^

"sourceFile.cpp", line 4: warning:
subscript out of range
x[2]=0;
^

"sourceFile.cpp", line 3: warning:
variable "x" was set but never used
int x[2];
^

"sourceFile.cpp", line 7: warning:
unrecognized #pragma
#pragma warning(pop)

但这不是我的问题。

我认为这种失败警告了 VC9 中的严重遗漏错误,(自从自动变量以来更是如此!!!!)。谁能给我一个严肃的理由让我改变主意?

最佳答案

许多编译器都可以选择错误处理这种事情。

但默认情况下,C 编译器允许这样做是非常传统的,甚至是适当的。这有多种原因。

  1. 请记住 x[i]i[x] 在 C 中是相同的东西。你甚至可以做 "string"[2 ] 或者您可以执行 2["string"] 并获得相同的结果。尝试一下。这是因为 x[i] 被定义为 *(x + i) 一旦 C 只是做指针运算然后取消引用它不在的表达式的结果编译器的域来决定它是否会工作。

  2. 鉴于指针算法是合法的,许多相当不错的设计模式实际上都依赖于技术下标违规

    struct s {    ...bunch of stuff...    int points[1]; // not really [1]};...struct s *p = malloc(sizeof (struct s) + someNumber * sizeof(int));

    今天到处都在运行这样的代码... 更新:嘿,这是一个实际的 example of the struct hack on stackoverflow .

关于c++ - 这在警告级别 4 的 VC9 中编译时没有警告。为什么有人不认为这是编译器缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365276/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com