我认为区别是声明没有参数类型…
为什么这样做:
int fuc(); int fuc(int i) { printf("%d",i); return 0; }
但是编译失败:
int fuc(); int fuc(float f) { printf("%f",f); return 0; }
带有消息:
error: conflicting types for ‘fuc’. note: an argument type that has a default promotion can’t match an empty parameter name list declaration
解决方法
声明:
int f();
…告诉编译器一些标识符(f,在这种情况下)命名一个函数,并告诉它函数的返回类型 – 但不指定函数的参数的数量或类型(s)打算收到.
原型:
int f(int,char);
否则相似,但也指定函数打算接收的参数的数量/类型.如果不需要参数,你可以使用类似于int f(void)的内容来指定(因为将括号留空是一个声明).新式功能定义:
int f(int a,char b) { // do stuff here... }
…也作为一个原型.
没有范围内的原型,编译器在调用函数之前将默认提升应用于参数.这意味着任何char或short它被提升为int,并且任何float被提升为double.因此,如果你声明(而不是原型)一个函数,你不想指定任何char,short或者float参数 – 调用这样的东西会/将给出未定义的行为.使用默认标志,编译器可能会拒绝代码,因为基本上没有办法正确使用它.你可能可以找到一些编译器标志,让它接受代码,但它是相当毫无意义的,因为你无法使用它…