Techniquement, ce n'est même pas valide C.
TrayMan était un peu hors de son analyse, oui 6.2.6.1 dit:
Except for bit-fields, objects are composed of contiguous sequences of one or more bytes, the number, order, and encoding of which are either explicitly specified or implementation-defined.
mais avec lien qui 6.2.5-20, qui dit:
— A structure type describes a sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type.
et maintenant vous pouvez conclure que les structures vont être un ou plusieurs octets car ils ne peuvent pas être vides. Votre code vous donne un avertissement, alors que le même code fait ne parviennent pas à compiler sur Visual Studio de Microsoft avec une erreur:
error C2016: C requires that a struct or union has at least one member
Donc, la réponse est non, il n'y a pas un moyen portable pour éviter cet avertissement, parce qu'il vous dit que vous violez les normes C. Vous devrez utiliser une extension spécifique au compilateur pour le supprimer.
Pourquoi avez-vous besoin que la taille soit zéro? –
Parce que j'ai une interface privée (dans laquelle j'ai ma structure de taille zéro parce que je n'implémente pas une certaine fonctionnalité) et une interface publique où certaines de mes structures privées deviennent opaques et doivent juste avoir la même taille que privée. – claf
Mon système de construction vérifie la taille de la structure privée et crée la structure publique avec un "char _opaque [SIZEOF_PRIVATE_STRUCT]". – claf