c arrays c99 function-prototypes c11

¿Cuáles son esos extraños tamaños de matriz[*] y[estática] en C99?



arrays function-prototypes (1)

estático en el declarador de matriz de parámetros

void f(int a[static 10]);

static aquí es una indicación de que el parámetro a es un puntero a int pero que el objeto de matriz (donde a es un puntero a su primer elemento) tiene al menos 10 elementos.

Un compilador tiene entonces el derecho de asumir que el argumento f no es NULL y, por lo tanto, podría realizar algunas optimizaciones. gcc actualmente no realiza ninguna optimización ( source ):

"La información proporcionada por estática en los declaradores de matriz de parámetros no se utiliza para la optimización. Podría tener sentido utilizarla en el futuro junto con el trabajo en la búsqueda previa".

calificador en parámetro declarador de matriz

void g(int a[cvr 10]);

dentro de g a es un puntero cvr a int ( cvr es const , volatile o restrict calificador). Por ejemplo, con const significa que a es un puntero de const a int (es decir, escriba int * const ).

Así que una declaración de parámetros:

T param[cvr e]

es lo mismo que una declaración de parámetro:

T * cvr param

* en el declarador de matriz de parámetros

void h(int a[*]);

El [*] en una declaración de parámetro de matriz formal en una declaración de función (que no es parte de una definición de función) indica que la matriz formal es una matriz de longitud variable.

Aparentemente los siguientes prototipos de funciones son válidos en C99 y C11:

void foo(int a[const *]); void bar(int a[static volatile 10]);

¿Cuál es el propósito de esos calificativos de notaciones de subíndices * , static y CV?

¿Ayudan a distinguir matrices de tipo variable de matrices de longitud variable? ¿O son sólo azúcar sintáctica?