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