我正在处理一些遗留的 C 代码。原始代码是在 90 年代中期编写的,针对那个时代的 Solaris 和 Sun 的 C 编译器。当前版本在 GCC 4 下编译(尽管有很多警告),它似乎可以工作,但我正在尝试整理它——我想尽可能多地排除潜在的错误,因为我确定什么可能是必要的使其适应 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);
}
问题:是否定义了缺少参数的函数调用的结果?如果是这样,该函数将为未指定的参数接收什么值?否则,Sun C 编译器的 ca. 1996 年(对于 Solaris,而不是 VMS)展示了一种可预测的特定于实现的行为,我可以通过向受影响的调用添加特定的参数值来模拟这种行为?