1

我有一个函数,它使用省略号接受可变数量的不同数据类型的参数。我想知道有什么方法可以让我得到他们每个人。如果不是全部,至少将特定参数(第一个或最后一个参数)与其余参数分开,并将va_list与其余参数分开。
声明是这样的:

    int foo (char *a , ...)

用法 :

    result = foo ("I'm a String",2,34.56,"one more String",2323232323);

    result = foo ("I'm another String",3,"again one more String",34.62,111111111);

所以,在这里(用法 1)我想从 va_list 中删除参数 '2' 并与其余部分一起制作另一个 va_list。函数声明很灵活,可以做相应的修改。
提前致谢

4

2 回答 2

1

请注意,可变参数函数必须有一种方法来确定省略号 ( va_list) 中的参数类型。printf()scanf()系列函数具有指定类型的格式字符串;系统调用有一个可选的open()第三个参数,但它始终是int; 并且该execl()函数采用所有相同类型的参数列表,char *以 NULL 指针终止)。

如果你有一个功能:

void foo_tail(va_list args);

您可以将函数编写foo()为:

int foo(char *a, ...)
{
    va_list args;
    va_start(args, a);
    int arg2 = va_arg(args, int);
    foo_tail(args);
    va_end(args);
    return arg2;
}

这实现了问题的要求:

从得到的参数'2'中删除并与其余部分一起va_list制作另一个。va_list

是否foo_tail()可以解决如何处理va_list给出的问题是一个单独的讨论;目前尚不清楚如何区分问题中显示的两个调用,但要处理这两个调用,必须以某种方式提供该信息。如图所示的混合类型的变量列表是非常有问题的。

于 2013-04-19T17:46:06.013 回答
0

当你使用va_arg你得到的参数实际上是从va_list. 所以其余的论点已经在你的va_list.

但是,例如,您不能从列表中获取任意参数。他们必须按顺序服用。你还必须知道你得到的参数的实际类型。

于 2013-04-19T17:27:28.687 回答