小编Nic*_*gny的帖子

使用不带参数的向前声明的C函数时,究竟是什么未定义?

摆弄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()应该只使用一个参数,但是:

  • 在x86上,除非使用GCC和-Wextra-Weverything否则GCC 9.1和clang 8.0.1均不显示任何警告(也不显示in 或其他内容)-O3。然后输出为2,不带-O30,带0。在Windows上,MSVC不会输出任何错误,程序只会输出随机数。
  • 在ARM(Raspberry Pi 3),GCC 6.3.0和clang 3.8.1上,我观察到相同的错误行为,该选项-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)

c x86 gcc arm clang

0
推荐指数
1
解决办法
71
查看次数

标签 统计

arm ×1

c ×1

clang ×1

gcc ×1

x86 ×1