Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中嵌套C结构的offsetof()+; 我尝试在C++(Linux)中的一个套接字中添加一个套接字过滤器。在套接字过滤器中,我需要获取struct fork\u proc\u事件的偏移量,它嵌套在另一个结构中。定义如下(cn_proc.h):_C++_C_Sockets_Struct_Offsetof - Fatal编程技术网

C+中嵌套C结构的offsetof()+; 我尝试在C++(Linux)中的一个套接字中添加一个套接字过滤器。在套接字过滤器中,我需要获取struct fork\u proc\u事件的偏移量,它嵌套在另一个结构中。定义如下(cn_proc.h):

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()行应该是什么样子?

考虑一下
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 to
char*
意味着您可以可靠地计算结构成员的偏移量。如果没有强制转换,您将在错误的类型上执行指针运算,并得到错误的结果。@Víctor Fernández:我在回答中也谈到了这个问题。
size_t off = 
  offsetof(proc_event, event_data.fork.parent_pid) - 
  offsetof(proc_event, event_data.fork);