C中的函数需要有类型吗?

sc1*_*353 2 c floating-point

问题

我正在编写以下代码,如下面摘录的那样,应根据每种硬币的数量返回总金额.

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).