微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么空的声明适用于具有int参数的定义,但不适用于float参数?

我认为区别是声明没有参数类型…

为什么这样做:

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 举报,一经查实,本站将立刻删除。