函数是用 K&R 风格编写的,你的原型不正确。其实还有其他问题……
#include <stdio.h>
void main() {
extern int fun(float);
int a=fun(3.5);
printf("%d",a);
}
int fun(aa)
float aa;
{
return ((int)aa);
}
main() 的返回类型是int,至少在标准 C 中是这样。您的打印语句应该包含换行符。
如果函数fun() 是用原型编写的,你的原型就可以了:
int fun(float aa) { ... }
但是,该函数是用 K&R 风格编写的,因此该函数需要传递一个 double,它将转换为 float:
int fun(double aa_arg) { float aa = aa_arg; ... }
在 K&R C 中,所有 float 值都作为 double 传递。这就是你得到垃圾的原因;你对你的编译器撒谎(可能是在不知情的情况下),它通过对你执行 GIGO 得到了自己的回报。
FWIW:GCC 4.6.1 拒绝编译您的代码(即使没有任何警告设置)。它抱怨:
f1.c: In function ‘main’:
f1.c:2: warning: return type of ‘main’ is not ‘int’
f1.c: At top level:
f1.c:9: error: conflicting types for ‘fun’
f1.c:3: error: previous declaration of ‘fun’ was here
您可以通过多种不同方式解决此问题:
#include <stdio.h>
int main(void)
{
extern int fun(float);
int a = fun(3.5);
printf("%d\n", a);
return(0);
}
int fun(float aa)
{
return ((int)aa);
}
或者:
#include <stdio.h>
int main(void)
{
extern int fun(double);
int a = fun(3.5);
printf("%d\n", a);
return(0);
}
int fun(double aa)
{
return ((int)aa);
}
或者:
#include <stdio.h>
int main(void)
{
extern int fun(double);
int a = fun(3.5);
printf("%d\n", a);
return(0);
}
int fun(aa)
double aa;
{
return ((int)aa);
}
或者:
#include <stdio.h>
int main(void)
{
extern int fun(double);
int a = fun(3.5);
printf("%d\n", a);
return(0);
}
int fun(aa)
float aa;
{
return ((int)aa);
}
或者:
#include <stdio.h>
int main(void)
{
extern int fun();
int a = fun(3.5);
printf("%d\n", a);
return(0);
}
int fun(aa)
float aa;
{
return ((int)aa);
}
我相信这些都是正确的,它们都应该在没有警告的情况下编译(除非您要求编译器抱怨旧式 (K&R) 函数定义等)。
将 GCC 设置为相当繁琐,我收到警告:
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f2.c -o f2
f2.c:12: warning: no previous prototype for ‘fun’
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f3.c -o f3
f3.c:12: warning: no previous prototype for ‘fun’
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f4.c -o f4
f4.c:12: warning: function declaration isn’t a prototype
f4.c: In function ‘fun’:
f4.c:13: warning: old-style function definition
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f5.c -o f5
f5.c:12: warning: function declaration isn’t a prototype
f5.c: In function ‘fun’:
f5.c:13: warning: old-style function definition
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f6.c -o f6
f6.c: In function ‘main’:
f6.c:5: warning: function declaration isn’t a prototype
f6.c: At top level:
f6.c:12: warning: function declaration isn’t a prototype
f6.c: In function ‘fun’:
f6.c:13: warning: old-style function definition