Oui, il fonctionnera de la croix-plate-forme, mais ce n'est pas nécessairement une bonne idée.
Conformément à la norme ISO C standard (toutes les citations ci-dessous proviennent de C11), 6.7.2.1 Structure and union specifiers /15
, il n'est pas permis à un rembourrage avant le premier élément d'une structure
En outre, 6.2.7 Compatible type and composite type
membres qui:
Deux types sont compatibles type si leurs types sont les mêmes
et il est incontestable que l' A
et A-within-B
types sont identiques.
Cela signifie que les accès à la mémoire de l' A
champs sera le même dans les deux A
et B
types, comme ce serait le plus judicieux b->a.x
, ce qui est probablement ce que vous devriez utiliser si vous avez des préoccupations au sujet de la maintenabilité dans le futur.
Et, bien que vous auriez normalement à vous soucier de type strict de l'aliasing, je ne crois pas que cela s'applique ici. Il est illégal de faire un alias de pointeurs, mais la norme a des exceptions.
6.5 Expressions /7
membres de certaines de ces exceptions, avec la note de bas de page:
Le but de cette liste est de préciser les circonstances dans lesquelles un objet peut ou peut ne pas être un alias.
Les exceptions énumérées sont:
-
a type compatible with the effective type of the object
;
- certaines autres exceptions qui ne doivent pas nous intéresse ici; et
-
an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union)
.
Ce qui, combiné à la structure de rembourrage règles mentionnées ci-dessus, y compris la phrase:
Un pointeur vers une structure de l'objet, convenablement converti, points à son premier membre
semble indiquer que cet exemple est spécifiquement autorisées. Le point central, nous avons à retenir ici est que le type de l'expression ((A*)b)
est A*
, pas B*
. Qui rend les variables compatible pour l'application de l'illimité d'alias.
C'est ma lecture des parties pertinentes de la norme, j'ai eu tort avant (a), mais j'en doute dans ce cas.
Donc, si vous avez un véritable besoin pour ce faire, il travaillera d'accord mais je serais documenter les contraintes dans le code très proche des structures de manière à ne pas vous faire piquer à l'avenir.
(a) Que ma femme va vous le dire, souvent et sans trop d'invites :-)