我正在处理一些老旧的C代码。原始代码编写于90年代中期,针对Solaris和当时的Sun C编译器。当前版本可以在GCC 4下编译(虽然有许多警告),并且似乎可以工作,但我正在尝试整理它 - 我想尽可能排除潜在的bug,以确定适应64位平台和其他编译器所需的内容。
在这方面,我的主要活动之一是确保所有函数都具有完整的原型(其中许多没有),在这个过程中,我发现了一些调用函数的代码(之前未进行原型声明),其参数比函数定义声明的更少。函数的实现确实使用了缺少的参数值。
例如:
impl.c:
int foo(int one, int two) {
if (two) {
return one;
} else {
return one + 1;
}
}
客户端1.c:
extern foo();
int bar() {
/* only one argument(!): */
return foo(42);
}
客户端2.c:
extern int foo();
int (*foop)() = foo;
int baz() {
/* calls the same function as does bar(), but with two arguments: */
return (*foop)(17, 23);
}
问题:如果函数调用缺少参数,那么结果是否定义?如果是,则函数将为未指定的参数接收什么值?否则,1996年左右(针对Solaris而非VMS),Sun C编译器是否会展现出我可以通过向受影响的调用添加特定参数值来模拟的可预测的实现特定行为?
NULL
等填充它们呢? - Kninnug