在查看Linux内核实现的双链接循环列表时,我发现了以下宏:

#define container_of(ptr, type, member) ({           \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})

其工作方式是返回指向只给定其一个成员地址的结构的指针:
struct blabla
{
    int value;
    struct list_head *list;
}

因此,您可以获得指向blabla的指针(并获得“value”),而只给出指向list的指针。
对于我的问题,我将如何使这个尽可能便携(符合C89/C99的最佳情况?)。由于使用了typeof(),所以这只是gcc。
这就是我目前所拥有的:
#define container_of(ptr, type, member) (                  \
                (type *) (char *)(ptr)-offsetof(type,member)\
                )

这个代码片段是否符合ISO标准(因此应该能够在任何符合标准的编译器上编译)?

最佳答案

正如ouah所评论的,({ ... })语句表达式是一个gnu扩展;您将无法使用它。您的核心表达式接近所需的值,但没有足够的括号:

#define container_of(ptr, type, member) \
                      ((type *) ((char *)(ptr) - offsetof(type, member)))

我觉得很干净。它只分布在两条线上。

关于c - 内核的“container_of”-是否使其符合ISO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10269685/

10-12 16:09