2015-12-26 22 views
0

下面的代码似乎有一些错误,我认为它会产生编译错误。特别是圆形函数的支撑和不正确的原型。编译器是怎么想的?为什么它认为它是可以接受的?这段代码是如何编译的? (C中的函数声明不正确)

#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; 
} 
+3

函数声明是一个非常古老的风格,仍支持http://stackoverflow.com/questions/1585390/c-function-syntax-parameter-types-declared-after-parameter-list –

回答

4

当你有一个函数声明没有象指定参数:

double circle(); 

功能被指定为采取的参数数目不详。所以编译器接受它。这在C中是有效的。如果你声明原型为:

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

你会看到编译器会发出关于它的诊断。

而在实际的功能定义中,您使用的是旧的声明,它被称为K & R风格。它已经过时了,但编译器仍然支持它。

+1

这不是一个原型!该标准专门称这种函数声明为“没有原型的声明”。 – fuz