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

Author: Kerrek SB, 2013-07-10

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.

 21
Author: ouah,
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