相关疑难解决方法(0)

了解Linux内核中的container_of宏

当我浏览Linux内核时,我找到了一个container_of定义如下的宏:

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

我理解container_of做了什么,但我不明白的是最后一句,也就是说

(type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

如果我们使用宏如下:

container_of(dev, struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)

最后一句的相应部分是:

(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)

看起来什么都不做.有人可以在这里填补空白吗?

c linux-kernel c-preprocessor

71
推荐指数
5
解决办法
7万
查看次数

访问struct成员就好像它们是单个数组一样?

我有两个结构,其值应该计算一个沉重的平均值,就像这个简化版本:

typedef struct
{
  int v_move, v_read, v_suck, v_flush, v_nop, v_call;
} values;

typedef struct
{
  int qtt_move, qtt_read, qtt_suck, qtd_flush, qtd_nop, qtt_call;
} quantities;
Run Code Online (Sandbox Code Playgroud)

然后我用它们来计算:

average = v_move*qtt_move + v_read*qtt_read + v_suck*qtt_suck + v_flush*qtd_flush + v_nop*qtd_nop + v_call*qtt_call;
Run Code Online (Sandbox Code Playgroud)

现在和他们一起我需要包含另一个变量.现在,例如,我需要包括v_cleanqtt_clean.我无法将结构更改为数组:

typedef struct
{
    int v[6];
} values;
typedef struct
{
    int qtt[6];
} quantities;
Run Code Online (Sandbox Code Playgroud)

这将简化我的工作,但它们是需要变量名称清晰的API的一部分.

所以,我正在寻找一种方法来访问那些结构的成员,也许正在使用sizeof(),所以我可以将它们视为一个数组,但仍然保持API不可更改.保证所有值都是int,但我不能保证一个的大小int.

在我脑海中写下这个问题......能union做到这一点吗?还有另一种聪明的方法可以自动化添加其他成员的任务吗?

谢谢,Beco

c arrays struct sizeof unions

6
推荐指数
3
解决办法
2万
查看次数

标签 统计

c ×2

arrays ×1

c-preprocessor ×1

linux-kernel ×1

sizeof ×1

struct ×1

unions ×1