【问题标题】:Programmatically retrieve memory offset of C struct members w/o hard-coding member names以编程方式检索没有硬编码成员名称的 C 结构成员的内存偏移量
【发布时间】:2012-11-30 20:54:29
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c gcc cross-compiling


    【解决方案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),
        /* ... */
    };
    

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

    【讨论】:

    • 谢谢。这看起来很有希望,我将在下一个项目中尝试一下。但是,如果我理解正确,您仍然需要将名称硬编码为 X() 宏的参数......我希望有一个更灵活的解决方案,我可以只为程序提供一个名称列表和其余的都是自动完成的。但是 - 就编程工作而言,建议的方法可能没有太大区别。
    • 顺便说一句,我认为声明应该是table[]?
    • 是的,我省略了。谢谢。固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多