如何打印结构中包含逗号分隔的子结构的所有字段名?
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"
谢谢!
答案 0 :(得分:4)
你不能在简单的C程序中这样做,我很害怕。字段的名称在运行时不可用 - 只有编译器才能看到它们。如果您不需要在运行时执行此操作,则可以考虑使用libclang
之类的内容来解析您的来源并提取您想要的信息。
答案 1 :(得分:1)
另一种选择是使用预处理器宏来创建结构,这提供了打印/反射的可能性。以下SO答案提供了proof-of-concept。
答案 2 :(得分:1)
首先,不要嘲笑我的建议,但我实际上是这样做的。
您只需在调试时打印结构,调试器就可以获得所有信息。 通常,结构以树视图的形式呈现:根没有数据,要查看成员的数据,您需要扩展根。由于我懒得将它们全部展开(并滚动查看它们),我抓住每个成员的值并在一行中汇总它们(逗号分隔)作为根的数据(非常宽视图。)
当然你没有自己喜欢的调试器的源代码! (我写了我的,非常原始的ollydbg插件)