7
votes

C expansion macro dans le code du noyau Linux

J'ai généralement ignoré à l'aide de macros tout en écrivant dans C mais je pense que je sais des fondamentaux à leur sujet. Bien que je lisais le code source de la liste dans le noyau Linux, j'ai vu quelque chose comme ça: xxx

(vous pouvez accéder à la partie restante du code de ici. )

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.


0 commentaires

5 Réponses :


3
votes

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.


0 commentaires

1
votes

La macro elle-même semble être utilisée dans la liste list.h .

Je suppose & des adresses moyennes dans le code. Le struct list_head contient deux pointeurs, il devrait donc être assez naturel pour la déclaration structure list_head nom = list_head_init (nom) (voir macro list_head ) à obtenir une paire de pointeurs comme initialisateur.


0 commentaires

0
votes

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.


0 commentaires

7
votes

Chaque fois que vous doutez de la macro, vous pouvez demander «GCC -E» de l'étendre pour vous.

Dans ce cas, il s'agit simplement d'initialiser une structure de liste avec des pointeurs à elle-même.


2 commentaires

Wow ne connaissait pas cette option auparavant. Merci


ou cpp -v à l'aide de préprocesseur



17
votes

Pour savoir ce qui se passe effectivement, nous avons besoin de la définition de struct list_head : xxx

considère maintenant les macros: xxx

si dans le code i écrire list_head (foo) il est étendu à: xxx

qui représente un vide doublement Liste liée avec un nœud d'en-tête où le suivant et prev pointerers pointer sur le nœud d'en-tête lui-même.

Il est identique que faire: xxx

si efficacement ces macros fournissent un moyen d'initialiser une liste doublement liée.

et Oui, & est utilisé ici comme adresse de l'opérateur.

EDIT:

Voici un Exemple de travail

dans le lien fourni par vous. Vous avez eu: xxx

qui est incorrect. Vous devriez avoir: xxx


3 commentaires

@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 et avez également signalé l'erreur dans votre code .


merci maintenant que j'ai vraiment eu.