问题
我正在编写以下代码,如下所示,该代码应根据每种硬币的数量返回总金额。
static int qNum = 0;
static int dNum = 0;
static int nNum = 0;
static int pNum = 0;
int main(){
float totalCost;
totalCost = totalMoneyCalc();
}
float totalMoneyCalc(void){
float total;
total = qNum*.25 + dNum*.10 + nNum*.05 + pNum*.01;
return total;
}
我遇到的错误
note: previous implicit declaration of ‘totalMoneyCalc’ was here
totalCost = totalMoneyCalc();
error: conflicting types for ‘totalMoneyCalc’
float totalMoneyCalc(){
然而,当我删除" float"作为totalMoneyCalc()函数的一部分,它不会再返回任何错误。 Aren你应该分配函数类型吗?
我尝试过的事情
我查看了this question on SO,其中提到了一些关于必须传递虚空作为功能的参数的一些内容,除了将原始代码添加到原始代码之外没有任何功能之外。 我还检查了一些primers on using floats的C中的函数,但是我遵循了这些并且它仍然不起作用。 我应该用指针做点什么吗?我不明白为什么在函数中返回一个赋值给变量的值与浮点数不同。如果有人有建议,修正或解释,我真的很感激。
答案 0 :(得分:10)
是的,所有C函数都有类型。在1999年标准之前,从声明中省略返回类型是合法的;这会隐式地给它一个int
的返回类型。从C99开始,必须始终明确指定返回类型。
同样在C99之前,调用没有可见声明的函数是合法的。编译器将假定一个返回类型为int
的函数(即错误消息中引用的“先前隐式声明”)。 C99放弃了这个规则;现在所有的功能都必须在你打电话之前明确宣布。
假设您正在使用gcc(看起来像gcc错误消息),编译器默认会强制执行C90规则。它报告的问题是totalMoneyCalc
的隐式声明(作为返回int
的函数)与后来的显式声明冲突,作为返回的函数float
。
解决方案是在通话前声明totalMoneyCalc
。您可以在main
之前添加单独的“转发”声明:
float totalMoneyCalc(void);
或者您可以将整个定义移到main
之上。 (即使在C90中,这也是一个好主意。)
次要要点:int main()
应为int main(void)
。
答案 1 :(得分:2)
编译器在使用之前需要了解该函数。如果编译器不知道该函数,那么它将无法知道函数是返回double
还是float
,或者它的第一个参数是指针还是结构,所以它默认情况下会想到它们都是int
的。
您可以在main()
float totalMoneyCalc(void);
或在main()
之前移动整个函数定义。