Какой смысл использовать va_copy? - PullRequest
3 голосов
/ 06 марта 2020

Я немного прочитал о функциях variadi c в C / C ++ и нашел thread , в котором упоминается повторное использование va_list в G CC, вам нужно использовать его копию с va_copy и в том же потоке они предложили определить его с помощью

#define va_copy(d,s) ((d) = (s)) Это означает, что оно просто присваивает значение va_list s va_list d.

Разве это не будет более читабельным для использования va_list ap1 = va_list ap вместо? Какой смысл создавать еще одну функцию с именем va_copy?

1 Ответ

9 голосов
/ 06 марта 2020

в G CC вам нужно использовать его копию с va_copy, и в том же потоке они предложили определить его с помощью

#define va_copy(d,s) ((d) = (s)) Это означает, что оно просто присваивает значение от va_list s до va_list d.

Это не то, что они говорят в другой теме. В ответе J Jorgenson говорится:

При попытке повторно использовать va_list на G CC, один ДОЛЖЕН использовать va_copy (), так как реализация G CC вызывает список va_list, который будет изменен, в результате чего указатель будет позиционироваться после последнего параметра после использования функцией av ?? printf ().

Это означает, что если вам нужно сделать копию в G CC, вам нужно использовать va_copy

ответ , который говорит о реализации va_copy как

A предыдущий вопрос об отсутствии va_copy в MSV C было несколько приличных предложений, в том числе для реализации собственной версии va_copy для использования в MSV C:

#define va_copy(d,s) ((d) = (s))

Говорит о MSV C, которая делает не реализовано va_copy. Причина, по которой вы бы добавили такой «бесполезный» макрос, заключается в том, что вы можете просто использовать va_copy и получить правильное поведение как в G CC, так и в MSV C.

Не будет было бы более удобочитаемым вместо этого использовать va_list ap1 = va_list ap? Какой смысл создавать еще одну функцию с именем va_copy?

В зависимости от того, как реализовано va_list, этого может быть недостаточно для выполнения va_list ap1 = va_list ap. Может случиться что-то, что не может быть сделано с operator =. Например, если va_list является типом указателя, вы не можете перегрузить operator = для него, поэтому вам нужно создать именованную «функцию».

...