【发布时间】:2015-10-10 00:05:00
【问题描述】:
我最近在 C 上 answered a question,其中我建议打开所有编译器警告。
我想我会复制粘贴我确信 gcc 在编译 OP 代码时会给出的实际警告。
除了它不起作用。我把它归结为这个测试用例它也不起作用:
int main() {
int a; /* not initialised */
while (a) { /* warn me! */
a++;
}
return 0;
}
我会把我的最后一分钱赌在gcc 上:
test.c: In function ‘main’:
test.c:4:6: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
while (a) {
^
...我会输的。我没有收到任何警告!然而,如果我使用if 而不是while,为什么是的,那么我得到的正是那个警告。但是while?一点耳语都没有。
我查看了一些似乎密切相关的 reports 并得出结论,虽然它们不适用,但 gcc 可能做了一些事情,这使得警告在这种情况下是多余的.我想知道是什么。
是不是因为a被初始化为0?不,因为
int main() {
int a;
if (a == 0) { printf("a is zero\n"); }
while (a == 0) { a = printf("a is zero\n"); }
return 0;
}
在 if() 上给出错误,但如果我将 if() 注释掉,则不再给出错误。如果 gcc 知道 a 将是 0,那么第一个 if 也应该不会引发错误。
那么这里发生了什么?
【问题讨论】:
-
嘿,如果没有你的副本,我不会阅读任何的!很有教育意义。
标签: c gcc undefined-behavior gcc-warning