调用一个没有参数的函数,虽然它需要一个

这是K&R-C,这里是代码: http : //v6shell.org/history/if.c

看看main-Method。 这行“if(exp())”。

但函数exp声明为:exp(s)。 所以需要一个论点。

为什么这样做? 你为什么要这样做?

最终,它是Unix V6 shell支持命令中的一个错误, if

该函数的代码是:

 exp(s) { int p1; p1 = e1(); if (eq(nxtarg(), "-o")) return(p1 | exp()); ap--; return(p1); } 

函数参数s ,隐式为int类型(函数为iteself),在函数中实际上是未使用的,因此bug是s的存在,而不是在exp()调用中没有参数。 所有具有零实际参数的调用都是正确的。

如果你看一下定义:

 exp(s) { int p1; p1 = e1(); if (eq(nxtarg(), "-o")) return(p1 | exp()); ap--; return(p1); } 
  1. s未使用
  2. C不需要编译时类型检查。 它甚至不需要检查function参数。 一切都是一系列的字节

为什么C不进行任何检查? 据我所知,这是因为在C的最初几年,计算机相当薄弱。 执行这些检查需要多次扫描源代码,这基本上会使编译时间增加n次。 所以它只进行一次传递,并按原样取名,这就是不支持函数重载的原因

因此,如果定义确实以某种方式使用了s ,那么很可能会在控制台上获得一些可怕的运行时错误

这是因为在c

当函数应用于某些参数时,编译器将无法对参数类型和arity执行编译时检查。 这可能会导致问题

调用未声明的函数是C中的不良风格(请参阅此内容)并且在C ++中是非法的

例如-

 #include 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链接以获取更多信息。