Как получить параметры другого типа из многоточия в C

У меня есть функция, которая принимает переменное количество аргументов разных типов данных, используя многоточие. Я хотел знать, есть ли способ, которым я могу получить каждый из них. Если не все, по крайней мере, отделите конкретный аргумент (первый или последний параметр) от остальных и 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) я хочу удалить параметр «2» из полученного va_list и сделать еще один va_list с остальными. Объявление функции является гибким и может быть соответствующим образом изменено.
Заранее спасибо.


person 302Found    schedule 19.04.2013    source источник
comment
Невозможно обработать, и после первого аргумента нет информации о типе аргумента.   -  person BLUEPIXY    schedule 19.04.2013


Ответы (2)


Обратите внимание, что функции с переменными аргументами должны иметь возможность определять типы аргументов в многоточии (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 got и сделайте еще va_list с остальными.

Сможет ли foo_tail() решить, что делать с полученным va_list, это отдельная дискуссия; неясно, как он будет различать два вызова, показанные в вопросе, но для обработки обоих эта информация должна быть каким-то образом доступна. Переменный список смешанных типов, как показано, очень проблематичен.

person Jonathan Leffler    schedule 19.04.2013

Когда вы используете va_arg, аргумент, который вы получаете, фактически удаляется из va_list. Так что остальные аргументы уже есть в вашем va_list.

Однако вы не можете не, скажем, получить произвольный аргумент из списка. Их нужно принимать по порядку. Вы также должны знать фактические типы аргументов, которые вы получаете.

person Some programmer dude    schedule 19.04.2013