2016-09-22 1 views
4

Je suis en train ci-dessous le code:Problème avec l'initialisation du membre du syndicat

typedef union Data 
{ 
    int i; 
}data; 

int main() 
{ 
    data d1;  
    d1.i = 10; // OK 
    data d3 = {7};// OK 
    data d2.i = 20; // Gives error 
} 

Ma question pourquoi il donne erreur pour data d2.i = 20 et travaille pour d'autres?

+0

'data d1 = {7}; // OK' devrait déjà donner une erreur car vous redéfinissez' d1'. –

+1

La dernière ligne déclare la variable 'd2', alors que pour les lignes d'initialisation précédentes, la variable' d1' a déjà été déclarée. la ligne 'd1 = {7}' utilise un type particulier de définition (une liste d'initialisation) où le '{}' dit "mettre ceci dans les membres dans l'ordre indiqué", la dernière ligne n'a pas ceci donc vous essayez pour déclarer une variable de type de données appelée 'd2.i' et donner à l'objet entier une valeur de 20. – Toby

Répondre

6

Parce que ce n'est pas une syntaxe valide.

Il n'a rien à voir avec le union, c'est-à-dire qu'il en serait de même pour un struct.

Vous essayez d'utiliser le nom d'un membre union comme nom, ce n'est pas valide. Les noms ne peuvent pas contenir le point (.).

Les initialisations fonctionnent car il existe une correspondance (sorte de) de l'expression d'initialisation (le côté droit) avec le type du côté gauche, mais ce n'est pas ce que vous essayez dans la dernière ligne.

Je pense que cela fonctionnerait, et en quelque sorte être proche:

data d2 = { .i = 20 }; 

Cette syntaxe utilise C99 pour nommer l'élément cible dans la liste initialiseur.