1

我有一个小程序,用于使用offsetof()运算符打印结构成员的偏移量。

我在许多情况下使用这个程序,其中所讨论的结构是不同的,因此我需要为每个项目(以及我对结构所做的每次修改)重新编程代码。由于这些结构往往相当大(控制和状态结构),更新会消耗大量时间。

我想要的是一种可以使用offsetof()等效方法的方法,但是第二个参数将是成员的名称,以字符串形式给出,而不是在语句中对其进行硬编码。

为简化起见,假设结构由 32 位字的单个字和数组组成,因此偏移量始终是 4 的倍数。

此外,欢迎使用替代方法来代替名称字符串。

[请注意,尽管成员都是字大小的,但仅通过计算成员来计算地址并不是一个好的解决方案,因为编译器可能会在成员之间添加填充。正如一个答案(已被删除)所建议的那样,使用 packed 属性可以通过删除填充来解决问题,这不是一个有效的解决方案,因为定义结构的实际应用程序可能会使用填充来优化内存访问]

4

1 回答 1

4

您制作以下形式的“符号表”数组:

#define S struct mystruct
#define X(m) { #m, offsetof(S, m) }
static const struct table {
    const char *name;
    size_t offset;
} table[] = {
    X(member1),
    X(member2),
    /* ... */
};

然后你可以有一个函数循环遍历表搜索给定的名称,并获得偏移量。您可以有多个这样的表,每个结构一个,都使用相同的搜索功能。如果成员太多以至于线性搜索性能成为问题,则可以进行二分搜索或添加哈希。

于 2012-11-30T21:04:43.857 回答