Как заполнить 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 всеми его параметрами.
Ответы
Ответ 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 и разбивать проблему на несколько вызовов (это не всегда возможно); или же
-
предположим, что фреймворк, который вы пытаетесь использовать, был плохо спроектирован...