Gra*_*Guy 5 c arguments argument-passing
所以今天我认为(int foo()事实上第一次)实际上不同于int foo(void)第一个允许任意数量的输入而第二个允许零.
是否int foo()只是忽略任何给定的输入?如果是这样,那么允许这种形式的功能有什么意义呢?如果没有,你怎么能访问它们,这与变量参数列表(例如类似的东西int foo (int argc, ...))有何不同?
小智 4
理解这一点的关键是理解调用堆栈。当您在 C 中调用函数时(使用标准 x86 ABI \xe2\x80\x94 其他平台可能有所不同),会发生什么情况:调用者在调用被调用者之前将所有参数以相反的顺序推送到堆栈上。然后,被调用者可以根据需要读取任意数量的参数。如果你使用 foo(void),显然你不会读到任何内容。如果您使用 foo(int),您将能够将一个单词读入当前帧下方的堆栈中。
\n\n使用 foo() (未指定参数)意味着编译器不会检查您传递给 foo 的参数。什么都可以; 没有合同。如果 foo 有两种不同的实现,它们采用不同的类型作为参数,并且我希望能够以编程方式将它们切换出来,那么这会很有用。(在汇编器中编写函数时,有时它也很有用,您可以自己处理堆栈和参数。)但请记住,编译器不会为您进行任何类型检查,因此您必须非常小心。
\n\n这与 foo(int, ...) 不同,因为在这种情况下,该函数实际上有一种方法来访问所有参数(使用可变参数)。没有理由实际使用 foo()定义函数,因为它基本上等同于 foo(void)。foo() 仅对声明有用。
\n