为什么 clang 和 gcc 在 `-std=c89` 选项下输出不同的结果?

问题描述 投票:0回答:1

我遇到了这个测验,所以想自己验证一下:

#include <stdio.h>

void
print_sum(a, b)
{
    printf("%d\n", a + b);
}

int
main(void)
{
    print_sum(1.5, 8.5);
    return 0;
}

我用https://godbolt.org/来测试它:
(1) 将

x86-64 clang (trunk)
-std=c89
选项一起使用,结果为
9

(2) 但是
x86-64 gcc (trunk)
加上
-std=c89
选项,结果是
158013177

根据我的理解,
a
b
的默认类型应该是
int
,所以在传递给
1.5
时,
1
应该转换为
8.5
8
转换为
print_sum()
。但显然
gcc
并没有遵循它。

所以我只是想知道

c89
,这是一个
gcc
错误还是上面的程序有“未定义的行为?

c gcc clang c89
1个回答
1
投票

程序有未定义的行为。

这个:

void
print_sum(a, b)

是一个“旧式”声明。它生成

a
b
类型的
int
参数,但它不会将该信息传达给任何调用者。

此电话:

print_sum(1.5, 8.5);

由于可见声明不是函数的原型,导致编译器假设被调用的函数采用两个

double
类型的参数。

解决方法是将声明更改为原型,即指定其参数类型的声明。改变这个:

void
print_sum(a, b)

对此:

void
print_sum(int a, int b)
© www.soinside.com 2019 - 2024. All rights reserved.