En général, cette C (et C seulement!) fonction vous permet de spécifier n'importe quel type de qualificatif à l'intérieur du tableau entre crochets; le exact standard citation est:
Une déclaration d'un paramètre comme un ‘tableau de type" doit être réglé à ‘qualifié pointeur vers
tapez", où le type de qualificatifs (le cas échéant) sont celles spécifiées dans l' [
et ]
de la
type de tableau de dérivation. Si le mot-clé static
apparaît également au sein de l' [
et ]
de la
type de tableau de dérivation, puis pour chaque appel à la fonction, la valeur du correspondant
argument réel doit fournir l'accès au premier élément d'un tableau avec au moins autant d'
éléments, comme spécifié par la taille de l'expression.
(C99, §6.7.5.3, ¶7, emphase ajoutée)
Cela signifie que ce n'est pas seulement limitée à la volatile
, mais const
et restrict
sont autorisés (voir Type de qualificatifs, §6.7.3 ¶1).
Le point de ce hack est essentiellement pour vous permettre d'ajouter un type de qualificatif pour le paramètre (pas à l'élément de la matrice) et encore conserver la syntaxe de tableau pour la déclaration; sans cette syntaxe, vous êtes obligés de revenir à l'écriture comme un pointeur (qui est ce qui se résume de toute façon , sauf pour l' static
de cas, qui, autant que je sache, n'a pas d'équivalent pointeur de la syntaxe).
Je soupçonne que l'idée est surtout de rendre la syntaxe un peu moins gênant pour les tableaux multidimensionnels; citant §6.7.5.3 ¶21:
void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
tout est équivalent, mais les 2 et 3 mai transmettre un peu mieux que cela n'est pas un pointeur, mais un tableau, et en permettant à certains endroit pour mettre la restrict
de qualification.
Aussi, comme dit plus haut, il semble y avoir aucun moyen d'avoir quelque chose comme
void f(double a[restrict static 3][5]);
(qui "spécifie également que l'argument correspondant à l' a
dans l'appel d' f
doit être un pointeur non null pour la première d'au moins trois tableaux de 5 doubles", ibidem) avec la "régulière" pointeur de la syntaxe.
Encore, je voudrais rester à l'écart de cette syntaxe, il est extrêmement obscure, rarement utilisé (je ne pense pas que j'ai jamais besoin d'ajouter un type de qualificatif à un tableau de paramètre de nouveau, le paramètre lui-même, pas le type de l'élément; restrict
est le seul cas d'utilisation qui permet de donner un sens) - et pas de portable à C++ (qui est pertinent en général, si vous écrivez une bibliothèque).