En C, comment déclarez-vous les membres d’une structure volatile?

Comment déclarez-vous un membre particulier d’une structure comme volatile?

Exactement la même chose que les champs non- struct :

 #include  int main (int c, char *v[]) { struct _a { int a1; volatile int a2; int a3; } a; a.a1 = 1; a.a2 = 2; a.a3 = 3; return 0; } 

Vous pouvez marquer la struct entière comme volatile en utilisant "volatile struct _a {...}" mais la méthode ci-dessus s’applique aux champs individuels.

Devrait être assez simple selon cet article:

Enfin, si vous appliquez volatile à une structure ou à une union, l’intégralité du contenu de la structure / union est volatile. Si vous ne souhaitez pas ce comportement, vous pouvez appliquer le qualificatif volatile aux membres individuels de la structure / union.

Juste un avertissement sur le mot clé volatile C / C ++.

Sauf si vous savez ce que vous faites, vous ne devriez jamais l’utiliser.

C / C ++ volatile! = Java / C # volatile

volatile ne permet pas de code threadé, sauf si vous savez vraiment ce que vous faites, vous devez utiliser le modèle atomique C ++ 0x (ou quelque chose de similaire).

La seule fois où j’ai eu à utiliser volatile est lors du contrôle des registres de matériel.

J’ai besoin de clarifier volatile pour C / C ++ car il y avait une mauvaise réponse ici. Je programme des microcontrôleurs depuis 1994, où ce mot clé est très utile et nécessaire souvent.

volatile ne cassera jamais votre code, il n’est jamais dangereux de l’utiliser. Le mot-clé assurera essentiellement que la variable n’est pas optimisée par le compilateur. Le pire qui puisse arriver si vous abusez de ce mot clé est que votre programme sera un peu plus gros et plus lent.

Voici quand vous AVEZ BESOIN de ce mot clé pour une variable: – Vous avez écrit une variable dans une fonction d’interruption. AND – Cette même variable est lue ou écrite dans des fonctions d’interruption externes. OU Si vous avez 2 fonctions d’interruption de priorité différente qui utilisent la variable, vous devez également utiliser «volatile».

Sinon, le mot-clé n’est pas nécessaire.

En ce qui concerne les registres de matériel, ils doivent être traités comme volatiles même sans le mot clé si vous ne faites pas de choses étranges dans votre programme.

Si les membres déclarés comme étant volatiles ne sont pas modifiés en raison du traitement d’une interruption (c’est-à-dire un gestionnaire de signaux ou une autre variable (proche) atomique), vous ne devriez probablement pas utiliser volatile (la plupart des compilateurs l’optimiseront si elle n’est pas assez proche).

Autrement, comme d’autres l’ont déjà dit, utilisez-le, puis examinez les dumps asm pour voir si votre compilateur est réellement d’accord avec vous 🙂

Dans certains cas, c’est-à-dire certaines versions de gcc, cela vaut la peine de vérifier ces dumps.