我有一个简单的C程序,有两个文件:main.c和test.c。
的main.c
#include <stdio.h>
int main(){
printf ("%f\n", test());
return 0;
}
test.c的
double test(){
return 2.5;
}
然后我使用命令gcc main.c test.c
编译代码。当我运行它时,程序输出0.000000
。不像我预期的那样2.500000
。我不知道为什么。
当我在同一个文件中定义test()
和main()
时,我没有遇到此问题。如果我在double test();
的主函数上方声明main.c
,我也不会遇到此问题。 但表示我还能在float test();
中声明main.c
,在这种情况下,即使声明与定义不匹配,编译器也不会发出警告,程序错误地输出0.000000
。
我认为我不了解的是链接过程是如何工作的,以及在其他文件中定义的变量和函数的真正范围规则是什么。
答案 0 :(得分:0)
你需要告诉main返回什么test()。 “%lf”也是双打。
#include <stdio.h>
double test();
int main(){
printf ("%lf\n", test());
return 0;
}
否则,编译器将错误地假设它返回int(并将返回值的位模式解释为int)。如果指定float(再次,错误),则编译器将尝试将返回的double的位模式解释为float。