请注意,在此代码中,顶部的 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;
}
答案 0 :(得分:3)
double quadratic();
声明一个函数,该函数返回带有未指定(但固定)参数数量的double
。
它与你的函数原型匹配:
double quadratic(double a, double b, double c)
{
/* ... */
}
这不等同于:
double quadratic(void);
这是一个函数的原型形式的声明,它返回一个没有参数的double
。
答案 1 :(得分:2)
如果省略参数列表,编译器会假定该函数存在,但不检查参数是否匹配。
如果您声明了double quadratic(void);
,那么您的代码将无法编译,因为签名将完整且不匹配。
要兼容两种功能类型,两者都应指定兼容 返回类型。而且,参数类型列表,如果两者都是 目前,应在参数数量和使用中达成一致 省略号终结符;相应的参数应具有兼容性 类型。如果一个类型具有参数类型列表而另一个类型是 由函数声明符指定,该函数声明符不是函数的一部分 定义,包含一个空的标识符列表,参数 list不应该有省略号终止符和每个的类型 参数应与由此产生的类型兼容 应用默认参数促销。
答案 2 :(得分:1)
最初在C中没有原型;只有函数声明,这些声明不包括参数列表。之后,当添加原型时,必须保留旧的声明形式以便向后兼容。
答案 3 :(得分:1)
在C中,函数声明中的空参数列表表示该函数采用未定义数量的参数。这就是C编译器不抱怨的原因。相同的代码在C ++中是一个错误,因为声明中的空参数列表意味着该函数不带参数。