¿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?