为什么空声明适用于带有int参数的定义但不适用于浮点参数?

我认为区别在于declaration没有参数类型……

为什么这样做:

 int fuc(); int fuc(int i) { printf("%d", i); return 0; } 

但这无法编译:

 int fuc(); int fuc(float f) { printf("%f", f); return 0; } 

随着消息:

错误:’fuc’的冲突类型。 注意:具有默认促销的参数类型不能与空参数名称列表声明匹配

声明:

 int f(); 

…告诉编译器一些标识符(在本例中为f )命名一个函数,并告诉它函数的返回类型 – 但是没有指定函数的参数的数量或类型。打算收到。

原型:

 int f(int, char); 

…在其他方面类似,但也指定了函数要接收的参数的数量/类型。 如果它不带参数,则使用类似int f(void)来指定(因为将括号留空是一个声明)。 一种新式的函数定义:

 int f(int a, char b) { // do stuff here... } 

……也可以作为原型。

如果没有范围内的原型,编译器会在调用函数之前将默认促销应用于参数。 这意味着任何charshort其提升为int ,并且任何float都会提升为double 。 因此,如果你声明(而不是原型)一个函数,你不想指定任何charshortfloat参数 – 调用这样的东西会/会给出未定义的行为。 使用默认标志,编译器可能会拒绝代码,因为基本上没有办法正确使用它。 您可能能够找到一些编译器标志来使它接受代码,但它会毫无意义,因为无论如何都无法使用它…

声明 int fuc(float); 告诉编译器存在一个函数fuc ,它接受一个float并返回一个int

int fuc(float f) { /*...*/ }定义告诉编译器实际上是什么,并且也提供了声明。

声明和定义之间的区别在于说存在大小为6的蓝帽和将某人制成6号大小的蓝帽之间的区别:声明说存在这样的事情,定义说这件事就在这里有问题。

prototype = forward声明,所以你可以在告诉编译器它的作用之前使用它。 但它仍然有参数。

在很多方面都很有用!