例如,
#include <stdio.h>
void foo();
int main(void)
{
foo();
foo(42);
foo("a string", 'C', 1.0);
return 0;
}
void foo()
{
puts("foo() is called");
}
输出:
foo() is called
foo() is called
foo() is called
这段代码可以成功编译(使用clang时没有警告)并且可以正常运行。但是我想知道传递给 foo()
的值会发生什么?它们是被推入栈中还是被丢弃了?
或许这个问题听起来毫无用处,但它确实有意义。例如,当我有 int main()
而不是 int main(void)
并且向其传递一些命令行参数时,main()
的行为是否会受到影响?
此外,在使用 <stdarg.h>
时,至少需要一个命名参数在 ...
之前由ISO C所要求。我们是否可以利用这样的声明 void foo()
来把从零到无限个参数传递给一个函数?
我刚刚注意到 void foo()
是一个“非原型声明”,而 void foo(void)
是一个“原型声明”。这与此有关吗?
澄清
似乎这个问题被标记为重复的What does an empty parameter list mean? [duplicate] (有趣的是,那个问题也是重复的...)。实际上,我不认为我的问题与那个问题有任何关系。它关注的是“在C中void foo()
的含义”,但我知道这意味着“我可以向它传递任意数量的参数”,我也知道这是一个过时的功能。
但是这个问题非常不同。关键词是“What if”。我只想知道如果我向 void foo()
传递不同数量的参数,就像上面的示例代码一样,它们是否可以在 foo()
中使用?如果可以,如何做到这一点?如果不行,传递的参数是否有任何区别?这就是我的问题。
va_start()
宏需要最后一个命名参数的名称,如果没有命名参数,它将无法运行。 - Jonathan Leffler<stdarg.h>
至少需要一个参数。这就是为什么我想知道是否可以使用()
的原因。顺便说一句:我已经澄清了这个问题,你能看一下吗? - nalzokfoo()
)的参数。 - Jonathan Lefflerfoo()
传递参数没有任何意义吗? - nalzok