Последний названный параметр не функция или массив?

Этот вопрос о функциях vararg и их последнем названном параметре перед многоточием:

void f(Type paramN, ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}

Я читал в стандарте C, и нашел следующее ограничение дляva_start макрос:

Параметр parmN является идентификаторомЭто самый правый параметр в списке параметров переменной в определении функцииnition (тот, что перед, ...). Если параметр parmN объявлен с классом хранения регистров, с типом функции или массива или с типом, который не совместим с типом, который получается после применения продвижения аргументов по умолчанию, поведение будет неопределеннымНед.

Интересно, почему поведение не определено для следующего кода

void f(int paramN[], ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}

и не определено для следующего

void f(int *paramN, ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}

Макросы предназначены для реализации в чистом C-коде. Но чистый код C не может выяснить, действительно лиparamN был объявлен как массив или как указатель. В обоих случаях тип параметра настраивается на указатель. То же самое верно для параметров типа функции.

Интересно: в чем смысл этого ограничения? Есть ли у некоторых компиляторов проблемы с реализацией этого, когда эти настройки параметров находятся внутри? (То же неопределенное поведение указано для C ++ - так что мой вопрос также про C ++).

Ответы на вопрос(5)

Ваш ответ на вопрос