理解C中的函数原型

rae*_*rem 3 c function

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

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

int foo()
{
    return 2;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个程序?

//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;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,以前都没有这两种情况下的功能定义main().那么为什么在第一种情况下无论如何调用函数,即使编译器之前没有定义它main()而不是第二种情况?

Iha*_*imi 7

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

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


jco*_*ens 6

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

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

评论:Jonathan Leffler评论说:

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

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