这段代码是如何编译的? (C中的函数声明不正确)

时间:2015-12-26 11:33:11

标签: c debugging compilation

以下代码中似乎有许多错误,我认为会产生编译错误。特别是圆形功能的支撑和不正确的原型设计。编译器认为发生了什么,为什么认为它是可以接受的?

#include <stdio.h>
#include <math.h>

double circle ();

int main(void)
{
    double r;
    double a;

    printf("Please enter a radius value: ");
    scanf("%lf", &r);

    a = circle(a, r);
    printf("%lf\n", a);
}

double circle(a, r)

double a, r;
{    
    a = M_PI*(r*r);

    return a;
}

1 个答案:

答案 0 :(得分:4)

如果您有一个函数声明而没有指定如下参数:

double circle ();

指定函数采用未指定数量的参数。所以编译器接受它。这在C中有效。如果您将原型声明为:

double circle (void); /* double takes no arguments */

您将看到编译器将发出有关它的诊断信息。

在实际的函数定义中,您使用的是旧声明,称为 K&amp; R style 。它已经过时但仍然是编译器支持它。