如何打印结构的所有字段名称

时间:2015-01-21 00:40:57

标签: c

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

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"

谢谢!

3 个答案:

答案 0 :(得分:4)

你不能在简单的C程序中这样做,我很害怕。字段的名称在运行时不可用 - 只有编译器才能看到它们。如果您不需要在运行时执行此操作,则可以考虑使用libclang之类的内容来解析您的来源并提取您想要的信息。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

首先,不要嘲笑我的建议,但我实际上是这样做的。

您只需在调试时打印结构,调试器就可以获得所有信息。 通常,结构以树视图的形式呈现:根没有数据,要查看成员的数据,您需要扩展根。由于我懒得将它们全部展开(并滚动查看它们),我抓住每个成员的值并在一行中汇总它们(逗号分隔)作为根的数据(非常宽视图。)

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