【问题标题】:Print a struct in C在 C 中打印一个结构
【发布时间】:2011-07-18 00:27:57
【问题描述】:

我正在尝试打印一个 struct 作为函数中的参数来进行一些调试。

我是否可以在不知道结构内容的情况下打印结构的内容,即不显式打印每个字段?你看,根据不同#defines 的负载,结构可能看起来非常不同,即可能有或没有不同的字段,所以我想找到一种简单的方法来做类似print_structure(my_structure) 的事情。

NetBeans 的调试器可以为我做到这一点,但不幸的是,代码运行在我无法运行调试器的设备上。

有什么想法吗?我想这是不可能的,但至少在编译时可能有一些宏可以做到这一点?

谢谢!

【问题讨论】:

  • 现在可以在 clang 编译器中实现。见my response to a similar question。 (不确定SO礼节是在此处发布重复的答案,还是链接到另一个)

标签: c printing struct


【解决方案1】:

C 中没有 RTTI 之类的东西,唯一的解决方案(除了上面的十六进制转储)是将#define 转储函数与其他#defines 一起使用,即。

#if _DEBUG

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

#else

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

#endif

【讨论】:

    【解决方案2】:

    您总是可以对结构进行十六进制转储:

    #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:是的。但是对于编译器的一些知识,这可能仍然包含有用的信息。你必须知道去哪里看。
    • @young001:那是因为它是用 C 编写的。在 C++ 中,您需要显式转换为 unsigned char const *
    • 稍微好一点,有分组和换行:printf("%02x%s", p[i], i==0 ? "" : i % 16 == 15 ? "\n" : i % 4 == 3 ? " " : "");
    • 我强烈不同意将多个三元运算符塞进一个参数“更好”的观点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2017-02-17
    • 2015-08-28
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多