编程方式检索存储器C结构构件的偏移的w / o硬编码会员名称(Programmatically re

2019-10-17 10:47发布

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

我在很多情况下,如有关的结构是不同的使用这个程序,所以我需要重新编写代码为每个项目(和每个修改我做的结构)。 由于这些结构往往是相当大的(控制和状态结构),更新会消耗大量的时间。

我想有是在那里我可以使用的方法offsetof()相当,但在第二个参数是成员的姓名,给出一个字符串,而不是硬编码在声明。

为了简化,让我们假设该结构由单和数组以下资料─32位字,因此偏移量是总是4的倍数。

此外,而不是名称字符串,另一种方法是值得欢迎的。

[ 注意,虽然成员都是字大小,仍然只是通过计数构件计算的地址不是因为编译器会成员之间添加填充一个很好的解决方案。 作为一个答案(其除去)建议,使用packed属性可通过移除填补处理解决的问题,这是不作为实际应用,其限定该结构可以使用填充用于优化存储器访问一个有效的解决方案 ]

Answer 1:

你让形式的“符号表”列:

#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),
    /* ... */
};

然后你就可以拥有它遍历表寻找一个给定的名称,并获得补偿的功能。 你可以有多个这样的表,每一个结构,都使用相同的搜索功能。 如果你有这么多成员,线性搜索性能成为一个问题,你可以二进制搜索或添加散列。



文章来源: Programmatically retrieve memory offset of C struct members w/o hard-coding member names