offsetof
From Wikipedia, the free encyclopedia
C's offsetof() macro is an ANSI C library feature found in stddef.h. It evaluates to the
offset (in bytes) of a given member within a struct orunion type, an expression of type size_t.
The offsetof() macro takes two parameters, the first being a structure name, and the second
being the name of a member within the structure. It cannot be described as a C prototype.
[1]
[edit]Implementation
The "traditional" implementation of the macro relied on the compiler being not especially picky
about pointers; it obtained the offset of a member by specifying a hypothetical structure that begins
at address zero:
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
This works by casting a null pointer into a pointer to structure st, and then obtaining the address of
member m within said structure.
While this works correctly in many compilers, it has undefined behavior according to the C standard,
since it involves a dereference of a null pointer (although, one might argue that no dereferencing
takes place, because the whole expression is calculated at compile time). It also tends to produce
confusing compiler diagnostics if one of the arguments is misspelled. Some modern compilers
(such as GCC) define the macro using a special form instead, e.g.
[2]
#define offsetof(st, m) __builtin_offsetof(st, m)
This builtin is especially useful with C++ classes or structs that declare a custom
unary operator &.
[3]
[edit]Usage
It is useful when implementing generic data structures in C. For example, the Linux
kernel uses offsetof() to implement container_of(), which allows something like
a mixin type to find the structure that contains it:
[4]
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
This macro is used to retrieve an enclosing structure from a pointer to a nested element, such as
this iteration of a linked list of my_structobjects:
struct my_struct {
const char *name;
struct list_node list;
评论0
最新资源