J'ai généralement ignoré à l'aide de macros tout en écrivant dans (vous pouvez accéder à la partie restante du code de ici. a >) P> Je n'ai pas compris la fonction d'ampersands (je ne pense pas qu'ils sont l'adresse des opérandes ici) dans list_head_init et donc l'utilisation de liste_head_init dans le code. J'apprécierais que quelqu'un puisse me plaindre. P> p>
5 Réponses :
Ils sont d'adresse des opérateurs ici. Les listes liées dans le noyau évitent les pointeurs NULL pour désigner la fin d'une liste. Par conséquent, l'en-tête doit être initialisé avec un pointeur valide. Dans cette implémentation, si le pointeur "Head" ou "Tail" pointe vers l'adresse de l'en-tête de la liste, la liste est considérée comme vide. P>
La macro elle-même semble être utilisée dans la liste Je suppose list.h code>. p>
& code> des adresses moyennes dans le code. Le
struct list_head code> contient deux pointeurs, il devrait donc être assez naturel pour la déclaration
structure list_head nom = list_head_init (nom) code> (voir macro
list_head code>) à obtenir une paire de pointeurs comme initialisateur. p>
C'est exactement ce qu'ils sont, les ampersands prennent l'adresse du paramètre et les stockent dans les champs de liste "Head" et "Suivant". Je ne pouvais pas vous dire pourquoi, puisque je n'ai pas trouvé d'utilisation réelle de cette macro, mais c'est ce que ça fait. P>
Chaque fois que vous doutez de la macro, vous pouvez demander «GCC -E» de l'étendre pour vous. P>
Dans ce cas, il s'agit simplement d'initialiser une structure de liste avec des pointeurs à elle-même. P>
Wow ne connaissait pas cette option auparavant. Merci
ou cpp -v à l'aide de préprocesseur
Pour savoir ce qui se passe effectivement, nous avons besoin de la définition de considère maintenant les macros: p> si dans le code i écrire qui représente un Il est identique que faire: p> si efficacement ces macros fournissent un moyen d'initialiser une liste doublement liée. p> et Oui, Voici un dans le lien fourni par vous. Vous avez eu: p> qui est incorrect. Vous devriez avoir: p> struct list_head code>:
list_head (foo) code> il est étendu à: p>
suivant code> et
prev code> pointerers pointer sur le nœud d'en-tête lui-même. p>
& code> est utilisé ici comme adresse de l'opérateur. p>
Exemple de travail code>
p>
@unicornaddict J'ai examiné le scénario similaire avant de poser cette question. Mais j'ai eu une erreur lorsque j'ai essayé ce code: Pastebin.com/P2CCFNBQ . J'ai essayé de donner vidité, int, macro etc ... et avoir des erreurs dans ces conditions aussi.
@holyDiver: J'ai mis à jour ma réponse avec un lien vers Exemple de travail B> et avez également signalé l'erreur dans votre code i>.
merci maintenant que j'ai vraiment eu.