¿El último parámetro nombrado no es función o matriz?

Esta pregunta es sobre las funciones vararg y el último parámetro nombrado de ellas, antes de los puntos suspensivos:

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

Estaba leyendo en el Estándar C, y encontré la siguiente restricción para elva_start macro:

El parámetro parmN es el identi fi cador del parámetro más a la derecha en la lista de parámetros variables en la definición de función (la que está justo antes de, ...). Si el parámetro parmN se declara con la clase de almacenamiento de registro, con una función o tipo de matriz, o con un tipo que no es compatible con el tipo que resulta después de la aplicación de las promociones de argumentos predeterminadas, el comportamiento no se define.

Me pregunto por qué el comportamiento no está definido para el siguiente código

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

y no indefinido para lo siguiente

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

Las macros están destinadas a ser implementadas por código C puro. Pero el código C puro no puede descubrir si o noparamN Fue declarado como una matriz o como un puntero. En ambos casos, el tipo de parámetro se ajusta para ser un puntero. Lo mismo es cierto para los parámetros de tipo de función.

Me pregunto: ¿Cuál es la razón de esta restricción? ¿Algunos compiladores tienen problemas con la implementación de esto cuando estos ajustes de parámetros están implementados internamente? (El mismo comportamiento indefinido se establece para C ++, por lo que mi pregunta es sobre C ++ también).

Respuestas a la pregunta(5)

Su respuesta a la pregunta