我有以下功能,只有一个可变参数列表(没有支持/固定参数)。是否可以将值传递给此函数?我使用的是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进行开发。
答案 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()
之间的拆分,以使用更清晰的界面。