在C语言中如何打印结构体

25
我正在尝试打印一个作为函数参数的结构体, 以进行一些调试。但是, 我不知道该结构体的具体信息,即不想逐个打印每个字段。因为根据许多不同的 #define, 可能会导致结构体看起来非常不同,即可能具有或者不具有不同的字段。所以我希望能找到一种简单的方法,类似于print_structure(my_structure)这样的方式来打印结构体。 NetBeans 的调试器可以为我完成这项工作,但不幸的是,代码正在运行无法运行调试器的设备上。 有任何想法吗?我认为这不可能实现,但至少可能有一些在编译时执行宏的方法吗? 谢谢!

1
现在clang编译器已经可以实现这个功能。请参见我对类似问题的回答。(不确定SO的礼仪是在此处发布重复的答案,还是链接到其他答案) - Jonathan Fuerth
2个回答

28

你可以对该结构进行十六进制转储:

#define PRINT_OPAQUE_STRUCT(p)  print_mem((p), sizeof(*(p)))

void print_mem(void const *vp, size_t n)
{
    unsigned char const *p = vp;
    for (size_t i=0; i<n; i++)
        printf("%02x\n", p[i]);
    putchar('\n');
};

该代码还将显示填充字节的内容。它们可以包含任何值,并且可以位于结构体内的任何位置。 - Lundin
1
@Lundin:没错。但是如果你了解编译器,这仍然可能包含有用的信息。你需要知道在哪里查找。 - Fred Foo
当我编译这个函数时,它告诉我 print_struct.cpp: 在函数 ‘void print_mem(const void*, size_t)’ 中: print_struct.cpp:14:30: 错误:从 ‘const void’ 到 ‘const unsigned char’ 的转换无效 [-fpermissive] - kuafu
1
@young001:这是因为它是用C语言编写的。在C++中,您需要使用显式转换来将其转换为“unsigned char const *”。 - Fred Foo
1
printf("%02x%s", p[i], i==0 ? "" : i % 16 == 15 ? "\n" : i % 4 == 3 ? " " : ""); - sehari24jam
3
我强烈反对将多个三元运算符塞入一个参数的观点认为是“更好”的做法。 - 3Dave

3

在C语言中没有像RTTI(运行时类型识别)这样的东西,除了像上面那样的十六进制转储之外,唯一的解决方案是将# define转储函数与其他# define一起使用。

#if _DEBUG

struct { ..... }
#define STRUCT_DUMP(x) printf(.....)

#else

struct { ..... } // other version
#define STRUCT_DUMP(x) printf(.....)    // other version dump

#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接