¿Cuáles son esos extraños tamaños de matriz [ * ] y [estática] en C99?
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 esas extrañas notaciones de subíndices*
, static
, ¿y calificaciones de CV?
¿Ayudan a distinguir los arrays de tipo estático de los arrays de longitud variable? ¿O son solo azúcar sintáctica?
1 answers
Static in parameter array declarator
void f(int a[static 10]);
static
aquí hay una indicación de que el parámetro a
es un puntero a int
pero que el objeto de la matriz (donde a
es un puntero a su primer elemento) tiene al menos elementos 10
.
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 (fuente):
"La información proporcionada por static in parameter array declarators no se utiliza para la optimización. Podría tener sentido usarlo en el futuro junto con el trabajo sobre la precolocación."
Calificador en declarador de matriz de parámetros
void g(int a[cvr 10]);
Dentro de g
a
es un cvr puntero a int
(cvr es const
, volatile
o restrict
calificador). Por ejemplo, con const
significa a
es un puntero const
a int
(es decir, escriba int * const
).
Así que un parámetro declaración:
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[*]);
La [*]
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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-09 23:35:31