我认为区别是声明没有参数类型…
为什么这样做:
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参数 – 调用这样的东西会/将给出未定义的行为.使用默认标志,编译器可能会拒绝代码,因为基本上没有办法正确使用它.你可能可以找到一些编译器标志,让它接受代码,但它是相当毫无意义的,因为你无法使用它…
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。