前向声明是否需要与定义中的对应声明相同?

时间:2013-04-18 21:04:37

标签: c forward-declaration

请注意,在此代码中,顶部的 double quadratic(); 与main下面的定义中的** double quadratic(double a,double b,double c)不匹配。

奇怪的是,这编译了!我正在使用 gcc -ansi -Wall -pedantic weird.c ,无论我使用什么标志,它仍然有效。

这违背了我所教过的内容。为什么这会编译正常?

#include <stdio.h>
#include <math.h>
double inputValues();
double quadratic();

int main()
{
        inputValues();
        inputValues();
        inputValues();
        return 0;
}

double inputValues()
{
        double a, b, c,derp;

        printf("Enter a value a: ");
        scanf("%lf", &a);

        printf("Enter a value b: ");
        scanf("%lf", &b);

        printf("Enter a value c: ");
        scanf("%lf", &c);

        derp = quadratic(a, b, c);

        printf("One x-value for this equation is %0.3f: \n", derp);
        return 0;
}

double quadratic(double a, double b, double c)
{
        double quad;

        quad = (-b + sqrt(b*b-4*a*c))/(2*a);
        return quad;
}

4 个答案:

答案 0 :(得分:3)

double quadratic();

声明一个函数,该函数返回带有未指定(但固定)参数数量的double

它与你的函数原型匹配:

double quadratic(double a, double b, double c)
{
   /* ... */
}

这不等同于:

double quadratic(void);

这是一个函数的原型形式的声明,它返回一个没有参数的double

答案 1 :(得分:2)

如果省略参数列表,编译器会假定该函数存在,但不检查参数是否匹配。

如果您声明了double quadratic(void);,那么您的代码将无法编译,因为签名将完整且不匹配。

C标准,委员会草案 - 2011年4月12日,§6.7.6.3.15

  

要兼容两种功能类型,两者都应指定兼容   返回类型。而且,参数类型列表,如果两者都是   目前,应在参数数量和使用中达成一致   省略号终结符;相应的参数应具有兼容性   类型。如果一个类型具有参数类型列表而另一个类型是   由函数声明符指定,该函数声明符不是函数的一部分   定义,包含一个空的标识符列表,参数   list不应该有省略号终止符和每个的类型   参数应与由此产生的类型兼容   应用默认参数促销。

答案 2 :(得分:1)

最初在C中没有原型;只有函数声明,这些声明不包括参数列表。之后,当添加原型时,必须保留旧的声明形式以便向后兼容。

答案 3 :(得分:1)

在C中,函数声明中的空参数列表表示该函数采用未定义数量的参数。这就是C编译器不抱怨的原因。相同的代码在C ++中是一个错误,因为声明中的空参数列表意味着该函数不带参数。