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

前端之家收集整理的这篇文章主要介绍了为什么空的声明适用于具有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参数 – 调用这样的东西会/将给出未定义的行为.使用默认标志,编译器可能会拒绝代码,因为基本上没有办法正确使用它.你可能可以找到一些编译器标志,让它接受代码,但它是相当毫无意义的,因为你无法使用它…

猜你在找的CSS相关文章