У меня есть функция, принимающая переменную, и NULL завершает список аргументов указателя, используя elipsis.Я знаю о списках аргументов шаблона переменной длины.Речь идет об унаследованном коде.Приведут ли следующие два вызова к неопределенному поведению, потому что терминатор интерпретируется как Serializable * va_arg?Каковы различия между двумя вызовами?
void serialize(Serializable* first, ...) {
va_list vl;
va_start(vl, first);
while(1)
{
Serializable* arg = va_arg(vl, Serializable*);
if(arg == NULL)
break;
/* serialize arg here */
}
}
serialize(obj1, obj2, obj3, NULL);
serialize(obj1, obj2, obj3, nullptr);