2009-10-08 151 views
1

我只有一个可变参数列表(没有支持/固定参数)以下功能。是否有可能传递给这个函数的值?我正在使用ANSI格式。如何从变量参数列表中获取数据?

Foo(...) 
{ 
} 

为了清楚起见,添加了一些要点。在我的特殊情况下,参数的数量及其类型以.xml文件的形式存储为可从Foo()访问的配置。

编辑:

我加入从我的试验和错误的信息。我部分成功地从列表中获取数据,如下所示。

va_list Arguments; 

Arguments = ((va_list) &Arguments + Offset); 

Data = va_arg(Arguments, Type); 

想法我放在这背后是直接从堆栈读取数据。这里的问题因素是Offset其值根据我传递给Foo()的参数数量而变化。例如,当我仅传递一个指针时,我将其值设为16以获得正确的结果。我通过试验和错误发现了这个值。我想从参数列表中推导出偏移量,我的程序可以在所有可能的情况下运行时没有运行故障。有人能告诉我这个偏移和参数列表之间的关系。

我正在使用Visual Studio 2008进行开发。

回答

2

现代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); 
} 
1

变量函数在现代C中需要固定参数,因为函数应该能够理清要从参数中做什么。例如,printf()知道根据格式字符串从堆栈中检索什么参数。如果您省略这些固定参数,则不会检查参数的正确性。

如果Foo()执行某种查找,那么传递xml引用或值查找作为参数(或更好:两者)是有意义的。

回到K & R风格C是相当讨厌。可能您可以更改解析器和解释器Foo()之间的分隔以使用更清晰的接口。

+0

谢谢;其实我不是在寻找能够通过的东西,因为我应该通过一些东西。我正在试图解决它而不添加任何冗余或虚拟信息。 – Vadakkumpadath 2009-10-10 15:44:56

+0

如果你的函数需要一些全局数据(比如一个xml引用),那么使用它会有意义(这不会是多余的,但会提高(较低))程序内的耦合度。 – Adriaan 2009-10-12 13:35:20