Для чего именно va_end? Всегда ли нужно это называть?

В Linux x86-64 можно выполнить c++ только один обход переменной va-arg va_list. Чтобы выполнить больше cpp обходов, его нужно сначала variable-length-arguments скопировать с помощью va_copy. man va_copy объясняет variable-length-arguments детали:

va_copy()

В очевидной cpp реализации va_list был бы cxx указателем на стековый c++ фрейм вариативной функции. В c++ такой настройке (на сегодняшний cpp день большинство обычное variadic-functions дело), ​​кажется, нет ничего cpp против присвоения

   va_list aq = ap;

К сожалению, существуют va-list также системы, которые превращают va-list его в массив указателей. (длины variadic-parameter 1), и там нужно

   va_list aq;
   *aq = *ap;

Наконец, в va-list системах, где аргументы передаются c++ в регистрах, это может быть необходимо variadic-functions для va_start() для выделения cpp памяти, сохранения аргументов variadic-parameter там, а также указание va-list того, какой аргумент следующий, так va-arg что va_arg() может пройтись va-list по списку. Теперь va_end() может variadic-parameter освободить выделенную память опять varargs таки. Чтобы приспособиться va-arg к этой ситуации, C99 добавляет variable-length-arguments макрос va_copy(), поэтому что c++ указанное выше назначение variadic-functions можно заменить на

   va_list aq;
   va_copy(aq, ap);
   ...
   va_end(aq);

Каждый вызов va-list va_copy() должен сопровождаться variable-length-arguments соответствующим вызовом. Использование variable-length-arguments va_end() в той же функции. Некоторые varargs системы, которые не поставляют va_copy() вместо variable-length-arguments этого имеет __va_copy, поскольку variadic-parameter это имя использовалось в черновик variable-length-arguments предложения.

c++

c

variadic-functions

2022-07-27T10:53:39+00:00
Вопросы с похожей тематикой, как у вопроса:

Для чего именно va_end? Всегда ли нужно это называть?