如何从变量参数列表中获取数据?

时间:2009-10-08 15:43:24

标签: c++ c

我有以下功能,只有一个可变参数列表(没有支持/固定参数)。是否可以将值传递给此函数?我使用的是ANSI格式。

Foo( ... )
{
}

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

修改

我在试验和错误中添加了一些信息。我部分成功地从列表中获取数据如下。

va_list Arguments;

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

Data = va_arg( Arguments, Type );

我把它放在后面的想法是直接从堆栈中读取数据。这里的问题因素是 Offset ,其值根据我传入Foo()的参数数量而变化。例如,当我仅传递指针时,我将其值设为16以获得正确的结果。我通过反复试验找到了这个值。我想从参数列表派生 Offset ,我的程序可以在所有情况下运行时没有任何运行时故障。有人能告诉我这个 Offset 和参数列表之间的关系。

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

2 个答案:

答案 0 :(得分:2)

现代C不支持没有固定参数的可变参数函数。但是,出于向后兼容的目的,它们由varargs.h支持。另请参阅this man page,其中提供了以下示例代码。请注意varargs所需的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 :(得分:1)

Variadic函数需要现代C中的固定参数,因为函数应该能够从参数中找出要做的事情。例如,printf()知道根据格式字符串从堆栈中检索哪些参数。如果省略这些固定参数,则不会检查参数的正确性。

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

回到K&amp; R风格C是非常讨厌的。可能您可以更改解析器和解释器Foo()之间的拆分,以使用更清晰的界面。