web-dev-qa-db-fra.com

Quel est le but du mot-clé statique dans le paramètre de tableau d'une fonction comme "char s [statique 10]"?

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

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

Avec une certaine expérimentation, il semble que d'autres qualificatifs puissent également apparaître ici:

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

Il semble que les qualificatifs ne soient autorisés qu'à l'intérieur du [] lorsque le tableau est déclaré comme paramètre d'une fonction. Que font-ils? Pourquoi est-il différent pour les paramètres de fonction?

129
dreamlax

La première déclaration indique au compilateur que someArray fait au moins 100 éléments de long. 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 deuxième 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 la même chose que si le paramètre était char * const someArray.

Cette syntaxe n'est utilisable que dans le plus intime [] d'un déclarateur de tableau dans une liste de paramètres de fonction, cela n'aurait aucun sens dans d'autres contextes.

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

La déclaration d'un paramètre en tant que "tableau de type" est ajustée à "" pointeur qualifié vers type "", où les qualificateurs de type (le cas échéant) sont ceux spécifiés dans le [ et ] de la dérivation de type tableau. Si le mot clé statique apparaît également dans le [ et ] de la dérivation du type tableau, puis pour chaque appel à la fonction, la valeur de l'argument réel correspondant doit donner accès au premier élément d'un tableau avec au moins autant d'éléments que spécifié par l'expression de taille.

115
Nordic Mainframe