有必要用C语言声明原型吗?

有必要用C语言声明原型吗?,c,function,C,Function,当我没有声明一个函数protype并且只有一个函数时,它会运行。但是,当我有多个函数时,它会给出错误: 函数名重新声明中的类型不匹配 涉及到几个不同的规则,但一般来说: 如果编译器在第一次调用函数之前看到原型,它知道该做什么 如果编译器在第一次调用之前看到函数本身,它知道该做什么 如果前两个都不是真的,编译器将根据调用函数的方式创建原型。如果随后的调用与发明的原型不匹配,您将得到您引用的错误。如果您的编译器是严格的,您也可能会得到一个错误,而不是隐式原型 我应该折叠哪本书 我建议从这开始。还有许

当我没有声明一个函数protype并且只有一个函数时,它会运行。但是,当我有多个函数时,它会给出错误:

函数名重新声明中的类型不匹配


涉及到几个不同的规则,但一般来说:

如果编译器在第一次调用函数之前看到原型,它知道该做什么

如果编译器在第一次调用之前看到函数本身,它知道该做什么

如果前两个都不是真的,编译器将根据调用函数的方式创建原型。如果随后的调用与发明的原型不匹配,您将得到您引用的错误。如果您的编译器是严格的,您也可能会得到一个错误,而不是隐式原型

我应该折叠哪本书


我建议从这开始。还有许多其他的和更为最新的书籍,但我的拙见是,当您处理C时,K&R是第一本。您通常希望在使用之前先对函数进行原型化。函数的数量无关紧要,但顺序很重要。有两种典型的做事方式:

以基本相反的顺序编写函数,最低级别的函数在文件开头,使用较低级别函数的更高级别函数在后面。 通常在函数实现之前的标题中使用单独的原型。
我在任何地方都看不到有人指出这一点,所以我想我会这样做:您的原型将area和area1函数声明为返回浮点数,并使用2个浮点数参数,但您将它们实现为返回voids,并且它们内部有一个return语句,这应该会让编译器对您大喊大叫


其次,您尝试给一个int变量一个浮点值,这是一个几乎未定义的行为,因此,虽然编译器可以让它通过,但这也不是您想要的。因此,正如更聪明的人所建议的那样,选择一本好的C语言书。

您应该以基本相反的顺序编写函数,最低级别的函数在文件的开头,以及使用以下较低级别函数的较高级别函数。并且通常在函数实现之前的标题中使用单独的原型。

挑选一本好书。您在哪里定义了函数?如果你能发布相关代码就更好了。我刚刚调用了函数。它运行,但当我有多个函数时,它会给我错误?@Lokesh the C bible,C编程语言第二版[平装本]Brian W.Kernighan作者Dennis M.RitchieAuthor@AdrianCornish我不同意,K&R第二版是老版本,过时的书鼓吹了许多不良的风格和危险的做法。它决不应被视为正典。例如,K&R p.26中关于这个问题的相关章节描述了函数和原型,指出函数跳过其返回语句是可以的,这是错误的,会导致未定义的行为。
#include <conio.h>
#include <stdio.h>

float area1(float, float);
float area (float, float);

void main()
{
   float x;
   float y;
   float a;
   float z;
   clrscr();
   x = 5.0;
   y = 5.0;
   z = area(x, y);
   a = area1(x, y);
   printf("%f", z);
   printf("%f", a);
   getch();
}

void area(float a, float b)
{
   int c;
   c = 0.5 * a * b;
   return c;
}

void area1(float a, float b)
{
   int c;
   c = 0.5 * a * b;
   return c;
}