43 votes

Quel est le but du mot clé "volatile" figurant dans un indice de tableau?

Pendant que je parcourais cppreference, j'ai vu un tableau de types étrange dans des paramètres de fonction comme celui-ci:

 void f(double x[volatile], const double y[volatile]);
 

Alors, quel est le but du mot clé volatile apparaissant dans un indice de tableau? Qu'est ce que ça fait?

40voto

Rxmsc Points 927

L' volatile mot-clé est utilisé pour déclarer un tableau de type de paramètre d'une fonction.

Ici, double x[volatile] est équivalent à double * volatile x.

Le cppreference dit :

Dans une déclaration de fonction, le mot-clé volatile peut apparaître à l'intérieur de la les crochets qui sont utilisés pour déclarer un tableau de type d'une fonction le paramètre. Il qualifie le type de pointeur pour laquelle le type de pile est transformé. Les déclarations suivantes déclarer la même fonction:

void f(double x[volatile], const double y[volatile]);

void f(double * volatile x, const double * volatile y);

Cette syntaxe valide uniquement en langage C dans les paramètres de la fonction.

14voto

Matteo Italia Points 53117

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).

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