我正在处理一些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这里讨论相同的问题.
谢谢!
如果你调用一个没有声明原型的函数(就像这里的情况那样),那么编译器会假定它接受任意数量和类型的参数并返回一个int.此外,char和short参数都提升到ints和floats的晋升为doubleS(这些被称为默认参数促销).
这在新的C代码中被认为是不好的做法,原因很明显 - 如果函数没有返回int,那么糟糕可以确保,你阻止编译器检查你传递了正确数量和类型的参数,并且参数可能会得到提升不正确.
C99是C标准的最新版本,它从语言中删除了这一功能,但实际上,即使在C99模式下运行,许多编译器仍允许使用它们,以实现传统兼容性.
至于额外参数,根据C89标准,它们在技术上是未定义的行为.但实际上,它们通常只会被运行时忽略.