繁体   English   中英

理解C中的函数原型

[英]Understanding Function Prototype in C

为什么以下程序运行正常?

int main()
{
    int x;
    x = foo();
    printf("%d",x);
    getchar();
    return 0;
}

int foo()
{
    return 2;
}

而不是这个程序?

//double function(void);

int main(){
    double val;
    val = function();
    printf("%ul\n",val);
}

double function(void){
    double num;
    num = DBL_MAX;
    printf("%ul\n",num);
    return num;
}

根据我的理解,在main()之前不存在这两种情况下函数的定义。 那么为什么在第一种情况下函数被调用,即使编译器在main()之前没有它的定义而不是在第二种情况下?

由于隐式函数声明,编译器假定未指定的类型默认为int

在第一种情况下巧合,但在第二种情况下则不然。

任何被称为函数C的东西默认都是int类型,没有参数(例如在你的第一种情况下)。 如果编译器然后找到符合的函数,则没有错误。

在第二种情况下,编译器编译main()认为函数是int,但后来发现它不是真的,并报告错误!

评论:Jonathan Leffler评论说:

仅限于C89 / C90。 不在C99; 不是在C11。 当然,有些厂商仍然只实施C89; 一个值得注意的例子是微软!

在C中,如果定义了函数,则其隐式返回类型为int

  • 在第一种情况下,函数的返回类型是int因此main()识别函数并编译而没有任何错误。

  • 在第二种情况下,函数的返回类型是double因此main()无法识别函数,从而生成错误,因此您需要声明函数的原型。

如果没有提到返回类型,那么直到C89的旧版本中,它被隐式地视为int

在C99标准中,即使返回类型为int也不允许返回返回类型。

有关更多详细信息,您可以检查: 隐式返回类型C.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM