【问题标题】:How do I print all the fieldnames of a struct如何打印结构的所有字段名
【发布时间】:2015-01-21 00:40:57
【问题描述】:

如何打印一个结构的所有字段名,其中还包含逗号分隔的子结构?

typedef struct logTimestamp_s{
    unsigned short lower;
    unsigned short tsLow;
    unsigned int tsHigh;
} logTimestamp;

typedef struct logHeader_s{
    unsigned short length;
    unsigned short code;
    logTimestamp ts;
} logHeader;

typedef struct __attribute__ ((__packed__)){
    logHeader   hdr;                //12
    unsigned int res1;              //16       unknown 4 bytes.
    unsigned char id;               //17        /* sub packet id */
    unsigned char ver;              //18        /* sub packet version */
    unsigned short size;            //20        /* sub packet size */
    unsigned int res2;              //24       unknown 4 bytes.
}log11AB;

例如,我正在寻找一种获取打印输出的方法,例如:

"length, code, lower, tsLow, tsHigh, res1, id, ver, size, res2"

谢谢!

【问题讨论】:

    标签: c


    【解决方案1】:

    恐怕你不能在一个简单的 C 程序中做到这一点。字段的名称在运行时不可用 - 只有编译器才能看到这些。如果您不需要在运行时执行此操作,您可以考虑使用 libclang 之类的东西来解析您的源代码并提取您想要的信息。

    【讨论】:

    • 啊。我懂了。行。取点。这个怎么样。那么有没有办法在结构中打印不同数据类型的所有值呢?编辑:嗯。 libclang 对我来说是新的。让我读一读。谢谢!
    • 不,该语言也没有编译时反射。当然,你可以在你的项目中添加其他的东西,也许可以解析 C 代码。
    • 该死。行。然后我将不得不手动将printf 的每个字段和它的值对应为一个超大规模超结构的不同数据类型。哦,嗯:-/。我想到了一些简单的方法可能会在那里,但似乎并不那么容易。没关系。
    • '字段的名称在运行时不可用':仍然是宏或一些编译时反射可以完成这项工作(事实证明这也是不可能的),所以这不是以任何方式解释。
    【解决方案2】:

    首先,不要嘲笑我的建议,但我确实做到了。

    你只需要在调试的时候打印结构体,调试器就有了所有的信息。 通常,该结构呈现为树视图:根没有数据,要查看成员的数据,您展开根。由于我懒得将它们全部展开(并滚动查看它们),我获取每个成员的值并将它们(逗号分隔)总结为一行作为根的数据(非常广泛的视图)。

    当然你没有你最喜欢的调试器的源代码! (我自己写的,很原始,ollydbg的插件)

    【讨论】:

    • 你的建议还可以。我实际上最终做了类似的事情。我通常不喜欢使用 GUI 编辑器,例如 CodeBlocks 或 Visual Studio。我是命令行类人的忠实粉丝。不过还是感谢您的回复。
    【解决方案3】:

    另一种选择是使用预处理器宏来创建您的结构,它提供打印/反射的可能性。以下 SO 答案提供了 proof-of-concept

    【讨论】:

    • 谢谢!这对以后的使用也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多