Этот вопрос касается функций vararg и последнего именованного параметра, перед многоточием:
void f(Type paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
Я читал в стандарте C и нашел следующее ограничение для макроса va_start
:
Параметр parmN является идентификатором самого правого параметра в списке переменных параметров в определении функции (тот, который был непосредственно перед,...). Если параметр parmN объявлен с классом хранения регистров, с типом функции или массива или с типом, который несовместим с типом, который возникает после применения промоакций по умолчанию, поведение не определено.
Интересно, почему поведение undefined для следующего кода
void f(int paramN[], ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
а не undefined для следующих
void f(int *paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
Макросы предназначены для реализации с помощью чистого кода C. Но чистый C-код не может определить, был ли объявлен paramN
как массив или как указатель. В обоих случаях тип параметра настраивается как указатель. То же самое верно для параметров типа функции.
Интересно: Каково обоснование этого ограничения? У некоторых компиляторов есть проблемы с реализацией этого, когда эти корректировки параметров на месте внутри? (Такое же поведение undefined указано для С++ - так что мой вопрос касается и С++).