177 votes

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

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 un peu d'expérimentation, il semble que d'autres qualificatifs puissent apparaître là aussi :

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

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

156voto

Nordic Mainframe Points 13717

La première déclaration indique au compilateur que someArray est 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 ne demande pas au compilateur de diagnostiquer quand un appel à la fonction ne répond pas à ces exigences (c'est-à-dire qu'il s'agit d'un comportement silencieux non défini).

La deuxième déclaration déclare simplement someArray (pas 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 qu'à l'intérieur de l'élément le plus proche de l'utilisateur. [] d'un déclarateur de tableau dans une liste de paramètres de fonction ; cela n'aurait pas de 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 dans C99) :

La déclaration d'un paramètre en tant que ''tableau de type'' est adaptée en ''pointeur qualifié de type'', où les qualificatifs de type (s'il y en a) sont ceux spécifiés dans le cadre de l'option [ et ] de la dérivation du type de tableau. Si le mot clé static apparaît également dans l'élément [ et ] de la dérivation du type de tableau, alors, pour chaque appel à la fonction, la valeur de l'argument réel correspondant doit permettre d'accéder au premier élément d'un tableau comportant au moins autant d'éléments que spécifié par l'expression de la taille. d'éléments que ceux spécifiés par l'expression de la taille.

39 votes

Sur ce sujet : Je me demande s'il ne faudrait pas considérer comme préférable d'utiliser int foo(struct bar [static 1]); au lieu de int foo(struct bar *); comme signature pour les fonctions qui n'acceptent pas les pointeurs NULL. (Je sais que gcc a une syntaxe alternative non standard pour signaler de telles fonctions afin que le compilateur puisse donner des avertissements )

4 votes

Je viens de vérifier gcc et clang et ni l'un ni l'autre ne suppose que someArray est toujours non nul lorsque je leur demande de comparer avec 0. J'ai également du mal à trouver la clause exacte dans C99 qui le définit. Il y a une note dans 6.7.5.3-21 qui mentionne la signification prévue et c'est tout. Je doute que nous puissions nous y fier. De plus, tout ceci ne fait pas partie de la signature de la fonction, donc il n'y a pas grand chose que nous puissions faire respecter à travers elle.

7 votes

Ce lien semble avoir pourri, est-ce que c'est ce vers quoi il pointait ? pic.dhe.ibm.com/infocenter/zos/v1r12/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X