【发布时间】:2016-05-27 08:40:46
【问题描述】:
例如,
#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]重复(有趣的是,那个问题也是重复的......)。事实上,我认为我的问题与那个问题无关。它侧重于“void foo() 在 C 中的含义”,但我知道这意味着“我可以向它传递任意数量的参数”,而且我也知道这是一个过时的功能。
但这个问题完全不同。关键词是“如果”。我只想知道我是否将不同数量的参数传递给void foo(),就像上面的示例代码一样,它们可以在foo() 中使用吗?如果是这样,这是如何完成的?如果不是,传递的参数有什么不同吗?这是我的问题。
【问题讨论】:
-
请注意,您不能使用无参数函数来传递零个或多个变量参数,因为
va_start()宏需要最后一个命名参数的名称——如果没有命名参数,它可以不行。 -
你说得对,
<stdarg.h>至少需要一个参数。这就是为什么我想知道是否可以使用()。 BTW:这个问题我已经说清楚了,你能看一下吗? -
值被压入堆栈;当函数返回时,调用函数会清除堆栈(这是 C 调用约定;其他语言使用不同的约定,因为被调用函数知道它传递了多少参数,或者使用了多少参数空间来传递它的参数,并且因此可以清除堆栈)。没有可移植的方式来使用传递给函数的参数,例如
foo()。 -
否;没有任何意义。你甚至可能认为这是无稽之谈。
-
@JonathanLeffler;我不认为这是一个骗局。
标签: c parameters command-line-arguments declaration function-declaration