如何从变量参数列表中获取数据?
问题描述:
我只有一个可变参数列表(没有支持/固定参数)以下功能。是否有可能传递给这个函数的值?我正在使用ANSI格式。如何从变量参数列表中获取数据?
Foo(...)
{
}
为了清楚起见,添加了一些要点。在我的特殊情况下,参数的数量及其类型以.xml文件的形式存储为可从Foo()访问的配置。
编辑:
我加入从我的试验和错误的信息。我部分成功地从列表中获取数据,如下所示。
va_list Arguments;
Arguments = ((va_list) &Arguments + Offset);
Data = va_arg(Arguments, Type);
想法我放在这背后是直接从堆栈读取数据。这里的问题因素是Offset其值根据我传递给Foo()的参数数量而变化。例如,当我仅传递一个指针时,我将其值设为16以获得正确的结果。我通过试验和错误发现了这个值。我想从参数列表中推导出偏移量,我的程序可以在所有可能的情况下运行时没有运行故障。有人能告诉我这个偏移和参数列表之间的关系。
我正在使用Visual Studio 2008进行开发。
答
现代C不支持不带固定参数的变量函数。但是,为了向后兼容的目的,它们受varargs.h的支持。另请参阅this man page,其中提供了以下示例代码。请注意可变参数所需的K & R风格函数定义。
#include <varargs.h>
void foo(va_alist) va_dcl {
va_list ap;
va_start(ap);
while(...) {
...
x = va_arg(ap, type);
...
}
va_end(ap);
}
答
变量函数在现代C中需要固定参数,因为函数应该能够理清要从参数中做什么。例如,printf()
知道根据格式字符串从堆栈中检索什么参数。如果您省略这些固定参数,则不会检查参数的正确性。
如果Foo()
执行某种查找,那么传递xml引用或值查找作为参数(或更好:两者)是有意义的。
回到K & R风格C是相当讨厌。可能您可以更改解析器和解释器Foo()
之间的分隔以使用更清晰的接口。
谢谢;其实我不是在寻找能够通过的东西,因为我应该通过一些东西。我正在试图解决它而不添加任何冗余或虚拟信息。 – Vadakkumpadath 2009-10-10 15:44:56
如果你的函数需要一些全局数据(比如一个xml引用),那么使用它会有意义(这不会是多余的,但会提高(较低))程序内的耦合度。 – Adriaan 2009-10-12 13:35:20