Оказывается, проблема в том, что gcc сделал va_list
типом массива.Моя функция была сигнатуры:
void foo(va_list ap);
, и я хотел передать указатель на ap
другой функции, поэтому я сделал:
void foo(va_list ap)
{
bar(&ap);
}
К сожалению, типы массивов распадаются натипы указателей в списках аргументов функции, поэтому вместо передачи указателя на исходную структуру я передавал указатель на указатель.
Чтобы обойти эту проблему, я изменил код на:
void foo(va_list ap)
{
va_list ap2;
va_copy(ap2, ap);
bar(&ap2);
va_end(ap2);
}
Это единственное портативное решение, которое я мог придумать, которое учитывает как возможность того, что va_list
является типом массива, так и возможность того, что это не так.