C vide struct — qu'est-ce à dire/faire?
J'ai trouvé ce code dans un fichier d'en-tête pour un appareil que j'ai besoin de l'utiliser, et bien que je fais du C depuis des années, je n'ai jamais rencontré ce:
struct device {
};
struct spi_device {
struct device dev;
};
et il a utilisé comme dans:
int spi_write_then_read(struct spi_device *spi,
const unsigned char *txbuf, unsigned n_tx,
unsigned char *rxbuf, unsigned n_rx);
et aussi ici:
struct spi_device *spi = phy->spi;
où elle est définie de la même.
Je ne suis pas sûr de ce que le point est à cette définition. C'est dans un fichier d'en-tête pour une application linux du conseil d'administration, mais je suis dérouté par l'utilisation. Des explications, des idées? Quelqu'un vu ça avant (je suis sûr que certains d'entre vous ont :).
Merci!
:bp:
- L'Allocation de la mémoire de la déclaration de
- Je ne suis pas sûr de ce que c'est censé signifier, mais c'est non-standard; la syntaxe d'une struct déclaration, il faut au moins un membre. C'est peut-être un espace réservé pour une future extension?
- Il ne semble pas attribuer quoi que ce soit...
- Normalement, il n'est pas un vide struct... et pourquoi cela a été fait dans ce cas, c'est difficile à dire sans plus de contexte.
- Une possibilité est-il utilisé pour être un membre de la struct "périphérique", quelqu'un a supprimé le membre parce qu'il n'était plus nécessaire et vous avez oublié de supprimer la structure ou de ne pas le supprimer car elle avait besoin de plus de modifications de code.
- Peut-être une partie de cela. Chapitre 9. Serial Peripheral Interface (SPI) Voir spi_alloc_master, struct spi_master etc.
- si vous pensez que l'une des réponses les réponses à votre question, pourriez-vous l'accepter?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas C que C structures doivent contenir au moins un membre nommé:
mais un GNU C extension:
https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html
je ne sais pas quel est le but de cette construction dans votre exemple, mais en général, je pense qu'il peut être utilisé comme une déclaration de type de structure.Remarque qu'en C++, il est permis d'avoir une classe avec aucun membre.Dans Linux 2.4, il est un exemple d'une structure vide de type à la compilation conditionnelle dans la définition de
spin_lock_t
type d'alias dans le noyau Linux 2.4 (dans include/linux/spinlock.h):Le but est de gagner de l'espace sans avoir à modifier les fonctions de l'API en cas
DEBUG_SPINLOCKS < 1
. Il permet aussi de définir les factice (de taille zéro) les objets de typespinlock_t
.Un autre exemple dans la (récente) du noyau Linux d'une structure vide hack utilisé avec compilation conditionnelle dans include/linux/de l'appareil.h:
Voir la discussion avec Greg Kroah-Hartman, pour ce dernier exemple ici:
https://lkml.org/lkml/2012/11/19/453
sizeof
être0
puis un tableau d'eux viole la règle que les différents objets doivent avoir des adresses différentes. Par exemple, ce qui se passe avecstruct device d[20], *ptr; for (ptr = d; ptr < d + 20; ++ptr)
?sizeof
serait toujours égal0
gcc
, pasg++
Ce n'est pas la norme C.
C11: 6.2.5-20:
J. 2 comportement Indéfini:
GCC utilise comme une extension (pas plus détaillé est donné, il y a environ quand/où devrait-il être utilisé). À l'aide de ce programme permettra de faire compilateur spécifique.
[C++11: 9/1]
).L'une des raisons pourrait le faire pour une bibliothèque est la bibliothèque de développeurs ne veulent pas que vous sachiez ou interférer avec le fonctionnement interne de ces struct. C'ces cas, ils peuvent fournir une "interface" de la version de leurs structures
spi_device/device
(qui est ce que vous pouvez voir) et un deuxième type de définition qui définit une autre version de cet structs pour une utilisation à l'intérieur de la bibliothèque avec les membres actuels.Puisque vous ne pouvez pas accéder les membres de la structure ou même de créer compatible avec les structures de ce type vous-même avec cette approche (même votre compilateur ne sais pas la taille réelle de la taille de cette structure), cela ne fonctionne que si la bibliothèque crée lui-même les structs, sans ne jamais vous passe les pointeurs, et n'a pas besoin de modifier tout les membres.
struct device;
. Mais la question montre quelque chose de différent: la structure a été défini pour être vide.Si vous ajoutez un vide struct comme le premier membre d'une autre structure, le vide
struct peut servir comme un "marqueur de l'interface", c'est à dire lorsque vous lancez un pointeur vers cette
externe de la structure d'un pointeur de l'intérieur de la structure et de la distribution réussit, vous savez
que l'extérieur struct est "marqué" comme quelque chose.
Aussi c'est peut-être une place de titulaire pour le développement futur, de ne pas assurer. Espérons que cela aide
Ceci est valable C
et facilite l'utilisation des adresses de zones opaques de la mémoire.
Ces adresses sont généralement obtenus à partir de et transmis à la bibliothèque de sous-programmes.
Par exemple, quelque chose comme cela se fait dans stdio.h