Linux内核代码中的C宏扩展

Linux内核代码中的C宏扩展,第1张

概述我一般在用C语言编写时忽略了使用宏,但我想我知道它们的基本原理.当我在 linux内核中阅读list的源代码时,我看到了类似的东西: #define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) (您可以从her 我一般在用C语言编写时忽略了使用宏,但我想我知道它们的基本原理.当我在 linux内核中阅读List的源代码时,我看到了类似的东西:
#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宏扩展所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存