C+中嵌套C结构的offsetof()+; 我尝试在C++(Linux)中的一个套接字中添加一个套接字过滤器。在套接字过滤器中,我需要获取struct fork\u proc\u事件的偏移量,它嵌套在另一个结构中。定义如下(cn_proc.h):
offsetof()行应该是什么样子?考虑一下C+中嵌套C结构的offsetof()+; 我尝试在C++(Linux)中的一个套接字中添加一个套接字过滤器。在套接字过滤器中,我需要获取struct fork\u proc\u事件的偏移量,它嵌套在另一个结构中。定义如下(cn_proc.h):,c++,c,sockets,struct,offsetof,C++,C,Sockets,Struct,Offsetof,offsetof()行应该是什么样子?考虑一下offsetof宏的实现可能会有什么帮助。这里有一个例子: #define offsetof(TYPE, MEMBER) \ ((uintptr_t)&(((TYPE*)0)->MEMBER)) 换句话说,使用0作为指向您感兴趣的类型的指针,只需获取struct字段的地址 因此,如果您想要parent\u pid相对于fork的偏移量(这就是我最初解析您的问题的方式): 二读时,听起来您可能只需要相对于struct proc\
offsetof
宏的实现可能会有什么帮助。这里有一个例子:
#define offsetof(TYPE, MEMBER) \
((uintptr_t)&(((TYPE*)0)->MEMBER))
换句话说,使用0
作为指向您感兴趣的类型的指针,只需获取struct字段的地址
因此,如果您想要parent\u pid
相对于fork
的偏移量(这就是我最初解析您的问题的方式):
二读时,听起来您可能只需要相对于struct proc\u事件开始的parent\u pid
的偏移量。调整上述示例,即:
((uintptr_t)&((struct proc_event*)0)->event_data.fork.parent_pid)
我并不完全理解所有这些黑客的必要性,当你所要做的就是给你的嵌套联合类型命名时。任何名字,只是为了能在C++代码中引用它
struct proc_event {
...
union whatever {
...
struct fork_proc_event {
__kernel_pid_t parent_pid;
...
} fork;
...
} event_data;
...
};
size_t off = offsetof(proc_event::whatever::fork_proc_event, parent_pid);
C++,在C++代码
中,可以将其称为<代码> PROCENECTOR::
struct proc_event {
...
union whatever {
...
struct fork_proc_event {
__kernel_pid_t parent_pid;
...
} fork;
...
} event_data;
...
};
size_t off = offsetof(proc_event::whatever::fork_proc_event, parent_pid);
如果您对从proc\u事件
开始的parent\u pid
的偏移感兴趣,您可以这样做
size_t off = offsetof(proc_event, event_data.fork.parent_pid);
如果无法更改声明,则可以通过执行以下操作来计算fork\u proc\u event
内部的父\u pid
的偏移量
size_t off =
offsetof(proc_event, event_data.fork.parent_pid) -
offsetof(proc_event, event_data.fork);
(虽然我不能马上说最后两个是否是offsetof
用法的正式法律示例,但它们在实践中通常不会出现任何问题。)只要看一下:它可能是proc\u event::fork::fork\u proc\u event
?不,它不起作用。我已经试过了。无论如何谢谢。也许:offsetof(struct proc_event,event_data.fork.parent_pid)-offsetof(struct proc_event,event_data.fork)谢谢,但是:错误:'struct proc_event'没有名为'fork'@VíctorFernández的成员-是的,一开始我没有注意到event_data
。请刷新。我也在用其他材料编辑答案。指针大小(除了某些函数指针)是一样的。将指针强制转换为char*或uintptr\t而不需要取消引用,这只会使代码在IMO中更难阅读。这有什么原因吗?@fish-I强制转换为char*
,以字节单位而不是指针类型的单位执行减法。(如果没有强制转换,减法甚至不会具有与操作数相同的指针类型,这太疯狂了!)我强制转换为uintpttr\t
,因为&foo->member
是指针类型,而不是整数-同样,在查找偏移量时,没有此强制转换是不明智的。@fish:cast tochar*
意味着您可以可靠地计算结构成员的偏移量。如果没有强制转换,您将在错误的类型上执行指针运算,并得到错误的结果。@Víctor Fernández:我在回答中也谈到了这个问题。
size_t off =
offsetof(proc_event, event_data.fork.parent_pid) -
offsetof(proc_event, event_data.fork);