【发布时间】:2014-04-03 07:38:46
【问题描述】:
我之前曾向a question 询问过带有未指定数量参数的 C 函数,例如void foo() { /* code here */ } 并且可以使用 未指定数量的未指定类型的参数调用。
当我询问像 void foo() { /* code here */ } 这样的函数是否有可能获取调用它的参数时,例如foo(42, "random")有人说:
您唯一能做的就是使用调用约定和所运行架构的知识,并直接从堆栈中获取参数。 source
我的问题是:
如果我有这个功能
void foo()
{
// get the parameters here
};
我称之为:foo("dummy1", "dummy2") 是否可以直接从堆栈中获取foo 函数中的 2 个参数?
如果是,如何?是否可以访问完整堆栈?例如,如果我递归调用一个函数,是否有可能以某种方式访问每个函数状态?
如果不是,那么带有未指定数量参数的函数有什么意义?这是 C 编程语言中的错误吗?在哪种情况下,任何人都希望 foo("dummy1", "dummy2") 为标头为 void foo() 的函数编译和运行良好?
【问题讨论】:
-
如果你知道它是如何被调用的(参数的类型是什么),你可以以与机器相关的方式来做到这一点(但是为什么要有这样的功能呢?)如果你不知道不知道,你不知道。
-
还要注意(无论如何在现代 C 中)
void foo() {}不接受任何参数。另一方面,void foo();(仅声明,未与定义结合)并没有说明foo需要什么。因此,在您的两个示例中,您都不能将任何内容传递给 foo。