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

时间:2011-03-30 03:35:41

标签: c function-declaration function-prototypes

我认为不同之处在于declaration没有参数类型......

为什么这样做:

int fuc();

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

但是编译失败:

int fuc();

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

带有消息:

  

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

3 个答案:

答案 0 :(得分:23)

声明:

int f();

...告诉编译器一些标识符(在这种情况下为f)命名一个函数,并告诉它函数的返回类型 - 但指定函数要接收的参数的数量或类型。

原型:

int f(int, char);

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

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

......也可以作为原型。

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

答案 1 :(得分:0)

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

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

声明和定义之间的区别在于说存在大小为6的蓝帽并且给某人制作6号蓝帽的区别:宣言说有这样的东西,定义说这件事就在这里是有问题的。

答案 2 :(得分:-1)

prototype =前向声明,因此您可以在告诉编译器它的功能之前使用它。但它仍然有参数。

在很多方面都很有用!