问题
我正在编写以下代码,如下面摘录的那样,应根据每种硬币的数量返回总金额.
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;
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误
note: previous implicit declaration of ‘totalMoneyCalc’ was here
totalCost = totalMoneyCalc();
error: conflicting types for ‘totalMoneyCalc’
float totalMoneyCalc(){
Run Code Online (Sandbox Code Playgroud)
但是,当我删除totalMoneyCalc()函数的"float"部分时,它不会再返回任何错误.你不应该分配函数类型吗?
我试过的
我在SO上查看了这个问题,其中提到了一些关于必须传入void作为函数的参数的事情,这些函数除了将原始代码添加到原始代码之外不起作用.我还检查了一些关于在C中使用浮动函数的引物,但我遵循了这些并且它仍然不起作用.我应该用指针做点什么吗?我不明白为什么返回一个要赋值给变量的函数中的值与浮点数不同.如果有人有建议,修正或解释,我真的很感激.
Kei*_*son 10
是的,所有C函数都有类型.在1999年标准之前,从声明中省略返回类型是合法的; 这会隐含地给它一个返回类型int.从C99开始,必须始终明确指定返回类型.
同样在C99之前,调用没有可见声明的函数是合法的.编译器将假定一个返回类型为的函数int(即错误消息中引用的"先前隐式声明").C99放弃了这个规则; 现在所有的功能都必须在你打电话之前明确宣布.
假设您正在使用gcc(看起来像gcc错误消息),编译器默认强制执行C90规则.它报告的问题是(作为函数返回)的隐式声明与后面的显式声明作为函数返回冲突.totalMoneyCalcintfloat
解决方案是totalMoneyCalc在通话前申报.您可以在以下之前添加单独的"前向"声明main:
float totalMoneyCalc(void);
Run Code Online (Sandbox Code Playgroud)
或者您可以移动上面的整个定义main.(即使在C90中,这也是一个好主意.)
一个小问题:int main()应该是int main(void).