Structure vide en C
J'ai une structure avec aucun des membres (pour l'instant) et je voudrais savoir si il est possible de supprimer l'avertissement-je obtenir:
warning: struct has no members
Est-il possible d'ajouter un membre, et de garder la sizeof
la structure de zéro? Toute autre solution?
source d'informationauteur claf
Vous devez vous connecter pour publier un commentaire.
Dans c le comportement d'une structure vide compilateur est dépendante par rapport à c++ où il fait partie de la spécification (explications ici)
en C c'est un peu plus glauque depuis le standard c99 a une langue qui implique que vraiment structures vides ne sont pas autorisés (voir TrayMan de réponse), mais de nombreux compilateurs ne le permettent (e.g gcc).
Depuis ce compilateur est dépendant, il est peu probable que vous obtiendrez réellement portable code dans ce cas. En tant que tel non portables pour supprimer l'avertissement peut être votre meilleur pari.
si vous avez juste besoin de la structure d'un symbole pour le casting et les arguments de la fonction, puis juste:
cela va créer le symbole d'une opaque.
Techniquement, ce n'est même pas valide C.
TrayMan était un peu dans son analyse, oui 6.2.6.1 dit:
mais un lien avec 6.2.5-20, qui dit:
et maintenant vous pouvez en conclure que les structures vont être un ou plusieurs octets parce que ils ne peuvent pas être vide. Votre code est de vous donner un avertissement, alors que le même code sera effectivement ne parviennent pas à compiler sur Microsoft Visual Studio avec une erreur:
Donc la réponse courte est non, il n'y a pas un portable de façon à éviter cet avertissement, car il vous dit que vous êtes violation du C normes. Vous aurez à utiliser un compilateur spécifique de l'extension de la supprimer.
Standard C99 est quelque peu ambiguë sur ce point, mais semble dire qu'un vide struct devrait avoir taille non nulle.
Nope. FWIW, C++ permet de vider les structures, mais le sizeof() est toujours non nulle pour un vide struct.
Pas tout facile. Il est intéressant de noter que vide les structures ne sont que peu pris en charge dans C et interdits en C99.
Vide les structures sont pris en charge en C++, mais différents compilateurs de les mettre en œuvre avec des résultats variables (sizeof et struct décalages), en particulier une fois que vous commencer à jeter de l'héritage dans le mélange.
Si vous n'êtes pas exigeant "trop strict" respect, vous pourriez sortir avec cette:
C'est un GCC extension.
J'ai été un peu en espérant que je serais en mesure d'utiliser le C99 fonctionnalité appelée "lanternes", a déclaré comme ceci:
mais cela ne fonctionne pas; ils exigent qu'il y a au moins un cycle de struct membre de la première, ils ne peuvent pas être le seul membre.
Le code ci-dessus extrait de rendement d'un non-zéro de la valeur de
sizeof(struct zero_information)
mais il peut vous aider à obtenir ce que vous cherchez pour que 100% de tous les stockage est alloué pour elle, est de rembourrage (accessible seulement par hacks, bien que je ne me souviens pas du haut de ma tête si l'adhérent le rembourrage est un comportement indéfini).