4

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

然而奇怪的是,这编译!我正在使用gcc -ansi -Wall -pedantic sorry.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

4 回答 4

3

double quadratic();

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

它与您的函数原型相匹配:

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

这不等同于:

double quadratic(void);

这是一个函数原型形式的声明,它返回double不带参数的 a。

于 2013-04-18T21:22:05.963 回答
2

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

如果您已声明,您的代码将无法编译,double quadratic(void);因为他们的签名将是完整的并且不匹配。

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

对于要兼容的两种函数类型,两者都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数数量和省略号终止符的使用方面达成一致;相应的参数应具有兼容的类型。如果一种类型具有参数类型列表,而另一种类型由不属于函数定义的函数声明符指定且包含空标识符列表,则参数列表不应有省略号终止符,并且每个参数的类型应与应用默认参数提升所产生的类型兼容。

于 2013-04-18T21:08:51.133 回答
1

在 C 中,函数声明中的空参数列表意味着该函数采用未定义数量的参数。这就是 C 编译器不抱怨的原因。相同的代码在 C++ 中会出错,因为声明中的空参数列表意味着该函数不接受任何参数。

于 2013-04-18T21:22:04.110 回答
1

最初在 C 中没有原型;有简单的函数声明,这些声明不包括参数列表。后来添加原型时,为了向后兼容,必须保留旧的声明形式。

于 2013-04-18T21:17:51.960 回答