Quels sont les avantages du sans nom structures et / ou les syndicats en C?
J'ai trouvé un code en œuvre que les semblables de démonstration ci-dessous ..
struct st
{
int a;
struct
{
int b;
};
};
De 6,58 sans nom struct/union
champs à l'intérieur de structs/unions
La mesure permise par la ISO C11
.
Mais Quels sont les avantages ?
Parce que de toute façon je peux accéder aux données membres d'une même manière comme
int main()
{
struct st s;
s.a=11;
s.b=22;
return 0;
}
compilé sur gcc 4.5.2 ,
gcc -Wall demo.c -o demo
et pas d'erreurs ,
double possible de Ce sont des anonymes, des structures et des syndicats utile pour C11?
OriginalL'auteur Omkant | 2012-11-14
Vous devez vous connecter pour publier un commentaire.
Il n'a pas à être un anonyme structure à l'intérieur d'une structure, que je ne trouve pas très utile: il s'agit seulement de changer la mise en page légèrement en introduisant plus de rembourrage, sans autres effets visibles (par rapport à l'in-lining, les membres de l'enfant struct dans le parent struct).
Je pense que l'avantage de l'anonymat de la structure et/ou les syndicats est ailleurs:
ils peuvent être utilisés à la place d'un anonyme structure à l'intérieur d'une union ou d'un anonyme de l'union à l'intérieur d'une structure.
Exemple:
x.b1='a'
, le reste b2, b3, b4 être initialisé et de prendre de l'espace mémoire?Même que pour une traditionnelle (nommé) de la structure à l'intérieur d'une union. Votre question est vraiment sur les syndicats contenant des structures. Vous devriez poser comme question au lieu d'un commentaire sur une réponse à une question plus spécifique, mais puisque vous avez le dernier,
x.b1='a'
ne pas initialiser les membresb2
,b3
,b4
mais ces faire “prendre de la mémoire de l'espace”, comme on peut le voir par l'impression de la valeur desizeof (union u)
. En théorie, si vous déclarez uneunion u
variable dont vous ne jamais utiliser leb1
membre, suffisamment intelligent compilateur ne peut réserver de la mémoire pourb1
, ...mais, en principe, la déclaration d'une
union u
objet signifie que vous pouvez écrire à l'un des membres de leurs structures qu'il contient, plus tard, de sorte que la mémoire doit être réservée pour eux.OriginalL'auteur Pascal Cuoq
L'avantage est évident, n'est-ce pas? Il enregistre le programmeur de venir avec un nom! Depuis en nommant des choses est dur, c'est bien qu'il est possible d'éviter de le faire si il n'y a pas de réel besoin.
C'est aussi un signal assez clair que cette
struct
est locale et n'est jamais utilisé n'importe où d'autre, mais dans le contexte d'un champ dans la structure, ce qui est vraiment, vraiment agréable d'informations, car il réduit la possibilité de inutile de couplage.Pense que
static
; il limite la visibilité de l'intérieur de lastruct
à l'extérieur, dans une manière semblable (mais non pas, bien sûr, l'équivalent) commentstatic
limite la visibilité des symboles globaux de l'unité de compilation dans lequel ils apparaissent.Le
struct
devient ainsi le local qu'il est difficile de comprendre pourquoi le programmeur n'est pas l'in-lining ses membres directement dans le parent de la struct. Cette réponse, dans sa version actuelle ne liste pas tout bénéfice à l'égard de cette alternative. La mise en page est différente entre les imbriquée struct par rapport à l'inline membres (avec plus de rembourrage, ce qui peut être l'effet voulu, mais serait normalement considéré comme un désavantage).Il semble qu'un anonyme
union
est beaucoup plus avantageux que celui d'un anonyme de la structure, pour la raison donnée ci-dessus.OriginalL'auteur unwind
Je viens de tomber sur un énorme avantage de l'anonymat de la
union
. Cependant prenez garde, il n'est pas une histoire pour les timides, ni est-il une pratique recommandée.Dans un ancien programme C de centaines de fichiers de code source il n'y est une variable globale, une
struct
, qui contenait unestruct
en tant que membre. Donc la définition de type pour la variable globale regardé quelque chose comme:La
struct
, STRUCTONE, a été l'un des plusieurs grandes structures toutefois, les autres étaient tous plus petits que STRUCTONE au moment de ce code a été écrit. Donc cette zone de mémoire,largeStruct
a été utilisé comme ununion
mais sans la source des déclarations indiquant de la sorte. Au lieu de diversesstruct
variables ont été copiés dans cette zone à l'aide dememcpy()
. Pour aggraver les choses, parfois par le nom réel de la variable globale, et parfois par l'intermédiaire d'un pointeur vers la variable globale.Que ce qui se passe généralement au fur et à mesure de récentes modifications ont donné lieu à l'un des autres structures de devenir le plus grand. Et j'ai été confronté à devoir passer par une centaine de dossiers où la recherche de cette a été utilisé avec tous les divers pseudonymes et tout le reste.
Et puis je me suis souvenu anonyme syndicats. J'ai donc modifié le
typedef
être la suivante:Et puis recompilé à chaque chose.
Donc maintenant, tous les jours de l'examen du code source de régression et les tests que j'ai malheureusement impatience ne sont plus nécessaires.
Et je peux maintenant commencer le processus d'une lente modification de la source à l'aide de ce mondial de porter cette source de plus en plus à des normes modernes sur ma propre table de temps.
OriginalL'auteur Richard Chambers