Как заполнить va_list - программирование
Подтвердить что ты не робот

Как заполнить va_list

Если у меня есть va_list, я знаю, как извлечь все его элементы:

void printInts(int n,...)
{
    va_list va;
    va_start(va, n);
    for(unsigned int i=0; i<n; i++)
    {
        int arg=va_arg(va, int);
        printf("%d",arg);
    }
    va_end(va);
} 

Поэтому, когда я вызываю printInts (3,1,2,3), va_list заполняется всеми параметрами.
Но как вручную заполнить va_list без использования va_start? Я хочу сказать, что мне нужно что-то вроде:

va_list va;
push_arg(va, int, 5); // And so on until I fill all parameters
...

Мне нужно это, потому что есть функция, которая принимает аргумент va_list как аргумент, и я не знаю, как заполнить этот va_list всеми его параметрами.

4b9b3361

Ответ 1

Нет возможности явно заполнить va_list.

Вы должны написать функцию обертки. Скажем, вам нужно вызвать функцию foo, вместо того, чтобы вручную заполнять va_list, вы определяете новую функцию следующим образом:

void call_foo(int arg1, ...)
{
   va_list ap;
   va_start(ap, arg1);
   foo(arg1, ap);
   va_end(ap);
}

Теперь вы можете вызвать foo, который принимает va_list, как вам нравится, например, call_foo (1,2,3,4);, call_foo (1, 1, "Hello" ); и др.

Это позволит вам указывать аргументы во время компиляции, вы не можете создавать аргументы во время выполнения.

Ответ 2

Обычно эти функции входят в пары. Если у вас есть функция "va-accepting", легко создать другую:

void printInts_v(int n, va_list ap)
{
    unsigned int i=0;
    for(i=0; i<n; i++)
    {
        int arg=va_arg(ap, int);
        printf("%d", arg);
    }
}

Эта функция может быть вызвана следующим образом:

void printInts(int n,...)
{
    va_list ap;
    va_start(ap, n);
    printInts_v(n, ap);
    va_end(va);
}

Но я не думаю, что есть способ предварительно переносить предварительный заполнение va_list для дальнейшего использования.

Если вы работаете над одной архитектурой, а переносимость - это не проблема, вы можете создать что-то самостоятельно. Как именно это делать с платформой.

Ответ 3

Я не думаю, что это стандартизированный способ сделать это. С другой стороны, такой предварительно заполненный va_list был бы бесполезным, так как нет способа "запросить" его для числа и типов доступных аргументов.

Ответ 4

Так как другие ответы говорят, что это невозможно (что было бы хорошей причиной добавить его в дизайн языка для следующей версии), единственной переносимой возможностью было бы

  • проверить документацию дважды, чтобы исследовать, если вы не пропустили или неправильно понять что - то о рамках, которую вы пытаетесь использовать: У меня была точно такая же проблема здесь, и она появилась в ответ, что я не использовал правильный вызов для того, что я пытался сделать;

  • написать себе функцию, которая будет принимать массив указателей в качестве параметра вместо va_list и разбивать проблему на несколько вызовов (это не всегда возможно); или же

  • предположим, что фреймворк, который вы пытаетесь использовать, был плохо спроектирован...