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?

27
demandé sur Kerrek SB 2013-07-10 02:52:21

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.

21
répondu ouah 2013-07-09 23:35:31