在ANSI C前语法中混淆函数调用

sky*_*der 5 c syntax function

我正在处理一些pre-ANSI C语法.请参阅我在一个条件中有以下函数调用

 BPNN *net;
 // Some more code
 double val;
 // Some more code, and then,
 if (evaluate_performance(net, &val, 0)) {
Run Code Online (Sandbox Code Playgroud)

但是函数evaluate_performance定义如下(具有上述条件的函数下面):

evaluate_performance(net, err)
BPNN *net;
double *err;
{
Run Code Online (Sandbox Code Playgroud)

为什么evaluate_performance用两个参数定义但用三个参数调用?'0'是什么意思?

顺便说一下,我很确定它并没有在其他evaluate_performance地方调用其他定义的东西; 我grep浏览了所有涉及的文件,我很确定我们应该在evaluate_performance这里讨论相同的问题.

谢谢!

Ada*_*eld 7

如果你调用一个没有声明原型的函数(就像这里的情况那样),那么编译器会假定它接受任意数量和类型的参数并返回一个int.此外,charshort参数都提升到ints和floats的晋升为doubleS(这些被称为默认参数促销).

这在新的C代码中被认为是不好的做法,原因很明显 - 如果函数没有返回int,那么糟糕可以确保,你阻止编译器检查你传递了正确数量和类型的参数,并且参数可能会得到提升不正确.

C99是C标准的最新版本,它从语言中删除了这一功能,但实际上,即使在C99模式下运行,许多编译器仍允许使用它们,以实现传统兼容性.

至于额外参数,根据C89标准,它们在技术上是未定义的行为.但实际上,它们通常只会被运行时忽略.

  • 谢谢(你的)信息。*叹息* ...遗留代码确实令人头疼。:| (2认同)