Quel est le but du mot-clé static dans un paramètre de tableau de fonction comme «char s [static 10]»?

144

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 quelques expérimentations, il semble que d'autres qualificatifs puissent y apparaître également:

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

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

dreamlax
la source

Réponses:

127

La première déclaration indique au compilateur une someArraylongueur d' au moins 100 éléments. Cela peut être utilisé pour les optimisations. Par exemple, cela signifie également que ce someArrayn'est jamais NULL.

Notez que le standard 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 someArrayles éléments de!) 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 profond []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, est en C11 6.7.6.3/7 (était 6.7.5.3/7 en C99):

Une déclaration d'un paramètre en tant que «tableau de type» doit être ajustée en «pointeur qualifié vers le type», où les qualificateurs de type (le cas échéant) sont ceux spécifiés dans la dérivation de type tableau [et ]de. Si le mot-clé static apparaît également dans la [et ]de la dérivation de type tableau, alors 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 le expression de taille.

Mainframe nordique
la source
35
Sur ce sujet: je me demande s'il devrait être considéré comme préférable d'utiliser int foo(struct bar [static 1]);plutôt int foo(struct bar *);que comme signature pour les fonctions qui n'acceptent pas les pointeurs NULL. (Je sais que gcc a une autre syntaxe non standard pour marquer de telles fonctions afin que le compilateur puisse donner des avertissements ..)
R .. GitHub ARRÊTEZ D'AIDER ICE
2
Je viens de vérifier gcc et clang et je ne suppose pas non plus 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 le sens voulu et c'est tout. Je doute que nous puissions nous fier à cela. De plus, tout cela ne fait pas partie de la signature de la fonction, donc il n'y a pas grand-chose que nous imposons à travers elle.
Nordic Mainframe
5
Ce lien semble avoir pourri, est-ce là ce qu'il indiquait? pic.dhe.ibm.com/infocenter/zos/v1r12/…
Ross Aiken
13
@NordicMainframe: Cela fait un certain temps, mais la version actuelle de clangmaintenant avertit correctement lorsque vous essayez de passer un argument connu-NULL à une fonction avec une [static 1]déclaration de paramètre.
dreamlax
1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功if (!someArray) { somecode... }pourrait être supprimé
MM