2

我正在尝试在 C++ (Linux) 中的一个套接字中添加一个套接字过滤器。在套接字过滤器中,我需要获取嵌套在另一个结构中的struct fork_proc_event的偏移量。定义如下所示(cn_proc.h):

结构 proc_event {
    ...
    联合{
        ...
        结构 fork_proc_event {
            __kernel_pid_t parent_pid;
            ...
        } 叉子;
        ...
    } 事件数据;
    ...
};

在 CI 中会这样做:

int off = offsetof(struct fork_proc_event, parent_pid);

但是我正在用 C++ 开发。如果我尝试这样做:

int off = offsetof(proc_event::fork_proc_event, parent_pid);

我收到以下错误:

错误:预期的类型说明符
错误:预期的“,”
错误:在 ',' 标记之前应为 `)'

offsetof() 线应该如何?

4

2 回答 2

5

offsetof考虑一下宏的实现可能会如何进行可能会有所帮助。这是一个例子:

#define offsetof(TYPE, MEMBER) \
    ((uintptr_t)&(((TYPE*)0)->MEMBER))

换句话说,0用作指向您感兴趣的类型的指针,并简单地获取结构字段的地址......

因此,如果您想要parent_pid相对于的偏移量fork(这是我最初解析您的问题的方式):

((char*)&((struct proc_event*)0)->event_data.fork.parent_pid) - ((char*)&((struct proc_event*)0)->event_data.fork)

在第二次阅读时,听起来您可能只想要parent_pid相对于struct proc_event. 改编上面的例子是:

((uintptr_t)&((struct proc_event*)0)->event_data.fork.parent_pid)
于 2012-07-26T07:13:51.050 回答
4

我并不完全理解所有这些技巧的必要性,因为您所要做的就是为您的嵌套union类型命名。任何名称,只是为了能够在 C++ 代码中引用它

struct proc_event {
    ...
    union whatever {
        ...
        struct fork_proc_event {
            __kernel_pid_t parent_pid;
            ...
        } fork;
        ...
    } event_data;
    ...
};

然后你就可以proc_event::whatever::fork_proc_eventoffsetofC++ 代码中引用它

size_t off = offsetof(proc_event::whatever::fork_proc_event, parent_pid);

如果您对parent_pid从开头的偏移量感兴趣proc_event,您可以执行

size_t off = offsetof(proc_event, event_data.fork.parent_pid);

如果您不能更改声明,您可以通过执行计算parent_pidinside的偏移量fork_proc_event

size_t off = 
  offsetof(proc_event, event_data.fork.parent_pid) - 
  offsetof(proc_event, event_data.fork);

(虽然我不能马上说最后两个是否是正式的合法offsetof使用示例,但它们通常可以在实践中正常工作,没有任何问题。)

于 2012-07-26T07:28:27.977 回答