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

时间:2015-01-19 21:59:05

标签: 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;
}

我遇到的错误

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中的函数,但是我遵循了这些并且它仍然不起作用。 我应该用指针做点什么吗?我不明白为什么在函数中返回一个赋值给变量的值与浮点数不同。如果有人有建议,修正或解释,我真的很感激。

2 个答案:

答案 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()之前移动整个函数定义。