Для чего именно 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
Для чего именно va_end? Всегда ли нужно это называть?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.