我有以下文件:
FC:
#include <stdlib.h>
double f(){
return 12345;
}
Run Code Online (Sandbox Code Playgroud)
main.c中:
#include <stdlib.h>
#include <stdio.h>
int main(){
double ret = f();
printf("%f\n", ret);
}
Run Code Online (Sandbox Code Playgroud)
我先用fc将fc编译成目标文件
gcc -c fc -o fo
然后使用它们组合
gcc fo main.c -o a.out
我期待输出为12345.000000,但我得到了0.000000.
哪一步出了问题?
你没有编译足够的警告.
因为你没说:
extern double f(void);
Run Code Online (Sandbox Code Playgroud)
在主程序中,C编译器被迫假设该函数将返回一个整数.这会破坏结果,因为编译器会将4个字节double视为a int,然后再将其转换为a double.
除非你使用的是C89编译器而不是C99或C2011编译器,否则你的编译器应该警告你没有范围内的原型.你应该打开更多的编译器警告,这样你就会被告知这些错误并且不会遇到这样的问题.
您可以为自己提供一个声明该函数的标头,f并在两个代码模块中包含该标头.标头充当两者之间,确保定义与使用一致.