Quel est le but du mot-clé statique dans le paramètre tableau de la fonction comme «chars »?

En parcourant un code source, je suis tombé sur une fonction comme celle-ci:

void someFunction(char someArray[static 100]) { // do something cool here } 

Avec quelques expérimentations, il apparaît que d’autres qualificatifs peuvent apparaître ici aussi:

 void someFunction(char someArray[const]) { // do something cool here } 

Il apparaît que les qualificatifs ne sont autorisés qu’à l’intérieur de [ ] lorsque le tableau est déclaré comme paramètre d’une fonction. Que font-ils? Pourquoi est-ce différent pour les parameters de fonction?

La première déclaration indique au compilateur que someArray au moins 100 éléments. Cela peut être utilisé pour des optimisations. Par exemple, cela signifie également que someArray n’est jamais NULL.

Notez que la norme C n’exige pas que le compilateur diagnostique lorsqu’un appel à la fonction ne répond pas à ces exigences (c’est-à-dire qu’il s’agit d’un comportement non défini silencieux).

La seconde déclaration déclare simplement someArray (pas les éléments de someArray !) Comme const, c’est-à-dire que vous ne pouvez pas écrire someArray=someOtherArray . C’est comme si le paramètre était char * const someArray .

Cette syntaxe ne peut être utilisée que dans le plus profond [] d’un déclarateur de tableau dans une liste de parameters de fonction, cela n’aurait aucun sens dans d’autres contextes.

Le texte standard, qui couvre les deux cas ci-dessus, se trouve dans C11 6.7.6.3/7 (était 6.7.5.3/7 en C99):

Une déclaration d’un paramètre comme ” tableau de type ” doit être ajustée sur ” pointeur qualifié sur le type ”, où les qualificateurs de type (le cas échéant) sont ceux spécifiés dans [ et ] de la dérivation de type tableau. Si le mot-clé static apparaît également dans [ et ] de la dérivation de type tableau, alors pour chaque appel à la fonction, la valeur de l’argument réel correspondant doit donner access au premier élément d’un tableau avec au moins autant d’éléments que spécifié. par l’expression de taille.