摆弄C的旧奇怪兼容行为时,我最终得到了这段代码:
#include <stdio.h>
int f();
int m() {
return f();
}
int f(int a) {
return a;
}
int main() {
f(2);
printf("%i\n", m());
}
Run Code Online (Sandbox Code Playgroud)
我确定f()in 的调用m()是未定义的行为,因为f()应该只使用一个参数,但是:
-Wextra,-Weverything否则GCC 9.1和clang 8.0.1均不显示任何警告(也不显示in 或其他内容)-O3。然后输出为2,不带-O30,带0。在Windows上,MSVC不会输出任何错误,程序只会输出随机数。-O3仍输出0,但正常编译会导致GCC为2,而...则为66688。当出现错误消息时,几乎是您所期望的:(非常有趣,因为a在打印行中没有出现)
foo.c: In function ‘m’:
foo.c:4:9: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
return f();
^~~
foo.c: In function ‘main’:
foo.c:11:2: warning: ‘a’ is …Run Code Online (Sandbox Code Playgroud)