Quelles sont ces tailles de tableau étranges [ * ] et [static] en C99?
Apparemment, les prototypes de fonctions suivantes sont valides en C99 et C11:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
Quel est le but de ces notations en indice étranges*
, static
, et les qualifications CV?
Aident-ils à distinguer les tableaux typés statiquement des tableaux de longueur variable? Ou sont-ils juste du sucre syntaxique?
1 réponses
Statique dans le déclarateur de tableau de paramètres
void f(int a[static 10]);
static
ici est une indication que le paramètre a
est un pointeur vers int
, mais que le tableau d'objet (où a
est un pointeur vers son premier élément) a au moins 10
éléments.
Un compilateur a alors le droit de supposer que l'argument f
n'est pas NULL
et qu'il pourrait donc effectuer certaines optimisations. gcc
n'effectue actuellement aucune optimisation (source):
" les informations fournies par static dans les déclarateurs de tableau de paramètres n'est pas utilisé pour l'optimisation. Il pourrait être logique de l'utiliser à l'avenir en conjonction avec le travail sur la pré-extraction."
Qualificatif dans le déclarateur de tableau de paramètres
void g(int a[cvr 10]);
À l'Intérieur de g
a
est un cvr pointeur sur int
(cvr est const
, volatile
ou restrict
qualifier). Par exemple, avec {[16] } cela signifie que a
est un pointeur const
sur int
(c'est-à-dire, tapez int * const
).
Donc un paramètre déclaration:
T param[cvr e]
Est identique à une déclaration de paramètre:
T * cvr param
* dans le tableau de paramètres de demande de déclaration
void h(int a[*]);
La déclaration de paramètre [*]
dans un tableau formel dans une déclaration de fonction (qui ne fait pas partie d'une définition de fonction) indique que le tableau formel est un tableau de longueur variable.