#define List_head_INIT(name) { &(name),&(name) }#define List_head(name) \ struct List_head name = List_head_INIT(name)
(您可以从here.访问代码的剩余部分)
我在List_head_INIT中并不理解&符号的功能(我不认为它们是 *** 作数的地址),因此在代码中使用了List_head_INIT.如果有人能开导我,我会很感激.
解决方法 要知道实际发生了什么,我们需要struct List_head的定义:struct List_head { struct List_head *next,*prev;};
现在考虑一下宏:
#define List_head_INIT(name) { &(name),&(name) }#define List_head(name) struct List_head name = List_head_INIT(name)
如果在代码中我写了List_head(foo),它会扩展为:
struct List_head foo = { &(foo),&(foo)}
它表示带有标题节点的空双向链表,其中next和prev指针指向标题节点本身.
它与做:
struct List_head foo;foo.next = &foo;foo.prev = &foo;
因此,这些宏有效地提供了一种初始化双向链表的方法.
是的,&在这里用作运算符的地址.
编辑:
这是一个working example
在您提供的链接中.你有过:
struct List_head test = List_head (check);
哪个不对.你应该有:
List_head (check);总结
以上是内存溢出为你收集整理的Linux内核代码中的C宏扩展全部内容,希望文章能够帮你解决Linux内核代码中的C宏扩展所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)