c/c++语言开发共享是否有一个C预处理器宏来打印结构?

据我所知,没有办法在C中打印出一个struct值。

即,这不会飞:

typedef struct { int a; double b; } stype stype a; aa=3; ab=3.4; printf("%z", a); 

相反,你必须说:

 printf("a: %dn", aa); printf("b: %fn", ab); 

这似乎是一个完美的地方,你可以使用宏来保存任意结构的大量输入。

C预处理器是否足以执行此转换?

    我认为最简单的解决方案(也许是最美的)是使用函数来打印特定的结构。

     void display_stype(stype *s) { printf("a: %dn", s->a); printf("b: %fn", s->b); } 

    如果您的结构发生了变化,您可以轻松地在一个地方适应您的代码。

    我会制作两个宏,如下所示:

     #define STYPE_FMT "%d %f" #define STYPE_MEMS(s) (s).a, (s).b 

    然后你可以这样做:

     printf("hello %s, stype: " STYPE_FMT "n", "world", STYPE_MEMS(my_s)); 

    这种方法优于结构的“打印function”的原因是,您可以将宏与任何printf -family函数一起使用,并组合其他数据的打印。

    你可以变得更加漂亮,而是:

     #define STYPE_FMT "%d %.*f" #define STYPE_MEMS(s) (s).a, 6, (s).b #define STYPE_MEMS_PREC(s, p) (s).a, (int)(p), (s).b 

    然后您可以使用默认精度或选择自定义精度。

    C预处理器是否足以执行此转换?

    是的,确实如此,但是你必须在宏中重复整个结构声明,这会破坏目的。 你可以这样:

     STRUCT_PRINTF( a , ( int, a ) ( double, b ) ); 

    然后你需要一个相当复杂的宏实现,有很多很多辅助宏/函数。

    不,C预处理器主要是文本宏替换工具。 它不知道C的类型和结构。

    您不能动态地或静态地(也不是在C ++中)迭代C中的struct成员。 C中没有反映。

    因此,无法使预处理器执行此转换。

    你可以为此制作宏:

     #define PRINT_MEMBER(M) do {printf(#M": %dn", (int) M;} while(0) 

    然后像这样打印:

     PRINT_MEMBER(aa); PRINT_MEMBER(b->b); 

    您可能想要定义其中的多个以涵盖不同类型(例如浮动,双打,打印为hex)。 不幸的是,没有好的解决方法,因为C预备记录器没有什么类型的概念,例如你不能使用像switch(typeof(M)) { case int: printf(.."%d"..; break; ...}

      以上就是c/c++开发分享是否有一个C预处理器宏来打印结构?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549774.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐