是否有一个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; ...}
。