Я немного растерялся.Зачем вам новый динамически сгенерированный va_list ?Почему бы просто не использовать старый?
Я полагаю, vsnprintf () использует текущий объект va_list (если это можно так назвать).Таким образом, вы можете va_start () , использовать нужные аргументы через va_arg () , а затем передать оставшиеся аргументы через va_list в vsnprintf() , а затем позвоните va_end () .
Я что-то упустил?Почему глубокая копия?
И если вам нужна глубокая копия, почему бы не va_start () fresh, удалить нужные аргументы с помощью va_arg () изатем передайте полученный va_list объект vsnprintf () .
(Каждый вызов va_arg изменяет объект va_list так что следующий вызов возвращает следующий аргумент.)
В качестве альтернативы, вы можете просто использовать va_copy () .(Хотя обязательно следуйте за ним с соответствующим va_end () .)
Приложение: Также обратите внимание, что эти макросы va_ основаны на стандартах C89 и C99.GNU g ++ будет их поддерживать.Microsoft несколько более ограничена.
Вслед за Комментарий TonyK :
То, что я сказал выше, работает, если вы тянете первыйN предметов из va_list .Если вы вытаскиваете предметы из середины, это сложнее.
Нет переносного пути к конструкции a va_list .
Однако вы можете отделить строку формата, использовать ее для определения типов объектов (double, float, int и т. Д.) И распечатать каждый из них отдельно со своей строкой формата (подраздел исходной строки формата),Многократные вызовы snprintf () вызовут некоторые накладные расходы.Но если эта процедура не вызывается слишком часто, она должна быть жизнеспособной.
Вы также можете распечатать подразделы исходной строки формата с соответствующим образом созданным va_list .Другими словами, первый вызов vsnprintf () печатает элементы 1..3, вторые элементы 5..7, третий 10..13 и т. Д. (As vsnprintf () будет игнорировать дополнительные элементы в va_list сверх того, что ему нужно. Вам просто нужна серия соответствующих форматных строк-фрагментов и добавление элементов из va_list с помощью va_arg () по мере необходимости для каждого vsnprintf () вызова.)