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

C中的函数需要有类型吗?,c,floating-point,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 =

问题

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

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(){
但是,当我删除totalMoneyCalc()函数的“float”部分时,它不再返回任何错误。你不是应该分配函数类型吗

我尝试过的

我看了一下,这说明了必须将void作为参数传递给函数,这些函数不接受任何内容,但将其添加到原始代码中也不起作用。 我还检查了C中的一些函数,但我遵循了这些,它仍然不起作用。
我应该用指针做些什么吗?我不明白为什么在函数中返回一个赋值给变量的值不同于int到float。如果有人有任何建议、修复或解释,我将不胜感激。

编译器需要在使用函数之前了解它。如果编译器不知道该函数,那么它将无法知道该函数是否返回
double
float
,或者它的第一个参数是指针还是结构,因此默认情况下,它将把它们都看作
int

您可以在
main()之前添加函数原型


或者将整个函数定义移到
main()

是的,所有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)

如果你调用的是代码后面定义的func,你需要一个原型。关于货币,有很多问题都是使用
float
表示美元、英镑或欧元,但是应该使用
int
表示美分或便士,请做一些研究。@WeatherVane:使用int的好处是因为float占用的字节数吗?您应该收到一条警告,告诉您隐式声明
totalMoneyCalc
返回
int
。如果没有,请将警告调高。“使用int的好处是因为float占用的字节数吗?”没有,这是因为
float
缺乏精度,尤其是在测试相等性时。在我的平台上,
float
int
都需要4个字节。这种“向前”声明即使在
main
函数内部也可能发生,这一点并不广为人知,就像变量的正常声明一样。这不是推荐的做法。特别是
float total、totalMoneyCalc(void)(它声明变量和函数),但应避免混淆。
float totalMoneyCalc(void);