典型的 C99 扩展结构的方法如下:
struct Base {
int x;
/* ... */
};
struct Derived {
struct Base base_part;
int y;
/* ... */
};
然后我们可以将 struct Derived *
的实例强制转换为 struct Base *
,然后访问 x
。
我想直接访问 struct Derived * obj;
的基本元素,例如 obj->x 和 obj->y。C11 提供了扩展结构体,但正如这里所解释的那样,我们只能在匿名定义中使用此特性。那么怎么写呢?
#define BASE_BODY { \
int x; \
}
struct Base BASE_BODY;
struct Derived {
struct BASE_BODY;
int y;
};
那么我可以像操作派生类的一部分一样访问基类成员,无需任何转换或中间成员。如果需要,我可以将Derived指针强制转换为Base指针。
这种方法可行吗?有什么要注意的吗?
gcc
或clang
中使用-fms-extensions
选项通过typedef
(请参见此答案)来实现,但这是非标准的。 - Grzegorz Szpetkowski