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

Do functions in C need to have types?

问题

我正在编写以下代码,如下摘录,应该 return 总金额取决于每种硬币的数量。

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" 部分时,它不会再出现 return 错误。你不是应该分配函数类型吗?

我试过的

我查看了 this question on SO,其中提到必须将 void 作为参数传递给不接收任何内容但将其添加到原始代码中的函数也不起作用。 我还检查了一些 primers on using floats 中的 C 函数,但我遵循了这些,但它仍然无法正常工作。 我应该用指针做点什么吗?我不明白为什么 return 将函数中的值分配给变量不同于整数到浮点数。如果有人有建议、修复或解释,我将不胜感激。

编译器需要在您使用该函数之前了解它。如果编译器不知道该函数,那么它将无法知道函数 returns doublefloat 或者它的第一个参数是指针还是结构,因此它将默认情况下,将它们全部视为 int

您可以在main()

之前添加一个函数原型
float totalMoneyCalc(void);

或将整个函数定义移动到main()之前。

是的,所有 C 函数都有类型。在 1999 标准之前,从声明中省略 return 类型是合法的;这将隐含地给它一个 return 类型的 int。从 C99 开始,必须始终明确指定 return 类型。

同样在 C99 之前,调用没有可见声明的函数是合法的。编译器会假定函数的 return 类型为 int(即错误消息中提到的 "previous implicit declaration")。 C99 放弃了这条规则;现在,所有函数都必须在调用之前进行可见声明。

假设您使用的是 gcc(看起来像 gcc 错误消息),编译器默认执行 C90 规则。它报告的问题是 totalMoneyCalcimplicit 声明(作为函数 returning int)与后面的 冲突显式 声明为函数 returning float.

解决方法是在调用前声明totalMoneyCalc。您可以在 main:

之前添加单独的 "forward" 声明
float totalMoneyCalc(void);

或者您可以将整个定义移动到 main 上方。 (即使在 C90 中,这也是一个好主意。)

一个小问题:int main()应该是int main(void)