【问题标题】:Linux kernel container_of macro example compilation errorsLinux 内核 container_of 宏示例编译错误
【发布时间】:2012-07-28 23:36:36
【问题描述】:

谁能告诉我这段代码有什么问题:

#include <stdio.h>
#include <stdlib.h>

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                                     \
                        const typeof( ((type *)0)->member ) *__mptr = (ptr);   \
                        (type *)( (char *)__mptr - offsetof(type,member) );})
typedef struct _elem {
        int     a;
        float   b;
        double  c;
} elem;

int main(int argc, char **argv)
{
        elem    *my_elem = (elem *)malloc(sizeof *elem);

        my_elem->a = 1;
        my_elem->b = 2;
        my_elem->c = 3;
        elem     *new_elem_a = container_of(&(my_elem->a), struct _elem, int);
        fprintf(stdout, "container_of(&(my_elem->a), struct _elem, int) = %p", new_elem_a);

        return 0;
}

编译时出现以下错误:

evariste@UnixServer:~$ gcc -Wall container_of_test.c -o container_of_test
container_of_test.c: In function ‘main’:
container_of_test.c:16:51: erreur: expected expression before ‘elem’
container_of_test.c:21:32: erreur: expected identifier before ‘int’
container_of_test.c:21:32: erreur: expected identifier before ‘int’

感谢您的帮助。

【问题讨论】:

    标签: c macros compilation linux-kernel


    【解决方案1】:

    这里有 2 个错误

    1. container_of 宏期望最后一个参数是成员名称。所以应该是

      elem *new_elem_a = container_of(&amp;(my_elem-&gt;a), struct _elem, a);

    2. elem *my_elem = (elem *)malloc(sizeof *elem)

      sizeof 的操作数错误,应该是

      elem *my_elem = (elem *)malloc(sizeof *my_elem)

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2019-02-11
      • 2018-04-19
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多