我认为不同之处在于declaration
没有参数类型......
为什么会这样:
int fuc();
int fuc(int i) {
printf("%d", i);
return 0;
}
但这无法编译:
int fuc();
int fuc(float f) {
printf("%f", f);
return 0;
}
留言:
错误:“fuc”的类型冲突。注意:具有默认提升的参数类型不能匹配空参数名称列表声明
我认为不同之处在于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...
}
...也可以作为原型。
如果范围内没有原型,编译器会在调用函数之前将默认提升应用于参数。这意味着 anychar
或short
it 提升到int
,并且 anyfloat
被提升到double
。因此,如果你声明(而不是原型)一个函数,你不想指定任何char
, short
orfloat
参数——调用这样的东西会/将给出未定义的行为。使用默认标志,编译器很可能会拒绝代码,因为基本上没有办法正确使用它。您可能能够找到一些编译器标志集,使其接受代码,但这毫无意义,因为无论如何您都无法使用它......
原型= 前向声明,因此您可以在告诉编译器它做什么之前使用它。但是,它仍然有参数。
在很多方面都很有用!
该声明 int fuc(float);
告诉编译器存在一个fuc
接受 afloat
并返回a 的函数int
。
该定义 int fuc(float f) { /*...*/ }
告诉编译器fuc
实际上是什么,并且还提供了声明。
声明和定义之间的区别在于说存在 6 号蓝色帽子和将 6 号蓝色帽子交给某人之间的区别:声明说有这样的东西,定义说这里的东西就是那个东西有问题。