使用以下代码:
int main(){
printf("%f\n",multiply(2));
return 0;
}
float multiply(float n){
return n * 2;
}
当我尝试编译时,我收到一个警告:“'%f' 期望 'double',但参数的类型为 'int'”和两个错误:“'multiply' 的类型冲突”,“'multiply' 的先前隐式声明是这里。”
问题1:我猜这是因为编译器在第一次遇到“乘法”函数时不知道它,他会发明一个原型,并且发明的原型总是假设“int”被返回并被视为范围。因此,发明的原型将是“int multiply(int)”,因此会出现错误。它是否正确?
现在,之前的代码甚至无法编译。但是,如果我将代码分解为这样的两个文件:
#file1.c
int main(){
printf("%f\n",multiply(2));
return 0;
}
#file2.c
float multiply(float n){
return n * 2;
}
并执行“gcc file1.c file2.c -o file”,它仍然会给出一个警告(printf 期待 double 但正在获取 int),但错误不会再出现,它会编译。
问题 2:当我将代码分成 2 个编译的文件时,为什么会这样?
问题 3:一旦我运行上面的程序(版本分为 2 个文件),结果是 0.0000 打印在屏幕上。怎么会?我猜编译器又发明了一个与函数不匹配的原型,但为什么打印的是 0 呢?如果我将 printf("%f") 更改为 printf("%d") 它会打印 1。同样,对幕后发生的事情有什么解释吗?
提前非常感谢。