它是K& R-C,这里是代码:http://v6shell.org/history/if.c
查看主要方法。这一行" if(exp())"。
但函数exp声明为:exp(s)。所以需要一个论点。
为什么这样做?你为什么要这样做?
答案 0 :(得分:8)
最终,它是Unix V6 shell支持命令if
中的一个错误。
该功能的代码是:
exp(s) {
int p1;
p1 = e1();
if (eq(nxtarg(), "-o")) return(p1 | exp());
ap--;
return(p1);
}
函数参数s
,隐含类型int
(函数自身),在函数中实际上是未使用的,因此错误是s
的存在,而不是调用exp()
时没有参数。所有具有零实际参数的调用都是正确的。
答案 1 :(得分:6)
如果你看一下定义:
exp(s) {
int p1;
p1 = e1();
if (eq(nxtarg(), "-o")) return(p1 | exp());
ap--;
return(p1);
}
s
未使用为什么C不进行任何检查?据我所知,这是因为在C的最初几年,计算机相当薄弱。执行这些检查需要多次扫描源代码,这基本上会使编译时间增加n次。所以它只进行一次传递,并按原样取名,这就是不支持函数重载的原因
因此,如果定义确实以某种方式使用s
,那么您很可能会在控制台输出精彩输出时出现一些可怕的运行时错误
答案 2 :(得分:2)
这是因为在c
当函数应用于某些参数时,编译器将无法对参数类型和arity执行编译时检查。这可能会导致问题
调用未声明的函数是C中的不良风格(请参阅此内容),非法使用C ++
例如 -
#include<stdio.h>
void f(int x);
int main()
{
f(); /* Poor style in C, invalid in C++*/
getchar();
return 0;
}
void f(int x)
{
printf("%d", x);
}
此程序可以使用,但不应该使用。请参阅此Wiki链接了解更多信息。