是否有一个C预处理器宏来打印结构?

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

即,这不会飞:

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

相反,你必须说:

 printf("a: %d\n", aa); printf("b: %f\n", ab); 

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

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

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

 void display_stype(stype *s) { printf("a: %d\n", s->a); printf("b: %f\n", 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": %d\n", (int) M;} while(0) 

然后像这样打印:

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

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