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

com*_*ler 12 c function-prototypes function-declaration

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

为什么这样做:

int fuc();

int fuc(int i) {
  printf("%d", i);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这无法编译:

int fuc();

int fuc(float f) {
  printf("%f", f);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

随着消息:

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

Jer*_*fin 23

声明:

int f();
Run Code Online (Sandbox Code Playgroud)

...告诉编译器一些标识符(f在这种情况下)命名一个函数,并告诉它函数的返回类型 - 但是没有指定函数的意图的参数的数量或类型受到.

原型:

int f(int, char);
Run Code Online (Sandbox Code Playgroud)

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

int f(int a, char b) { 
    // do stuff here...
}
Run Code Online (Sandbox Code Playgroud)

...也可以作为原型.

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