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.