【发布时间】:2016-06-11 06:39:41
【问题描述】:
在代码中,我看到下面定义的宏我无法理解。
#define OFFSET_OF_FIELD_(f) (reinterpret_cast<char*>( \
&reinterpret_cast<NetParameter*>(16)->f) - \
reinterpret_cast<char*>(16))
宏名似乎是在计算类结构中字段 f 的偏移量。它的形式是从一个字段的地址中减去起始地址。这里如何使用 16 号?并且 deosn't reinterpret_case 仅适用于 16?(不是 16 -> f)。 如果有人请向我解释这段代码,我将不胜感激。
【问题讨论】:
-
它似乎是在“想象”一个位于通用地址 16 的
NetParameter对象,只是为了计算f字段的偏移量。我完全反对这种黑客行为。 -
@MarcoA。但为什么是 16?为什么不是 0。在某些情况下,这种“黑客”也是完全合法的。 en.cppreference.com/w/cpp/types/offsetof
-
@xaxxon 我的问题也是如此。我猜不是 0 是为了避免空指针问题,但是为什么不是 8 或 32?
-
优先使用旧标准(POSIX.1-2001、POSIX.1-2008、C89、C99)的offsetof marco而不是OFFSET_OF_FIELD_