в 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 =
для него, поэтому вам нужно создать именованную «функцию».