Existe-t-il une macro de préprocesseur en C pour imprimer une structure?

Autant que je sache, il n’ya aucun moyen d’imprimer une valeur de struct en C.

c’est-à-dire que cela ne vole pas:

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

à la place, vous devez dire:

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

Cela semble être un endroit parfait où vous pourriez utiliser une macro pour enregistrer une grande quantité de frappe pour des structures arbitraires.

Le préprocesseur C est-il assez puissant pour effectuer cette transformation?

Je pense que la solution la plus simple (et peut-être la plus belle) consiste à utiliser une fonction pour imprimer votre structure spécifique.

 void display_stype(stype *s) { printf("a: %d\n", s->a); printf("b: %f\n", s->b); } 

Si votre structure a changé, vous pouvez facilement adapter votre code à un endroit.

Je ferais deux macros, comme ceci:

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

Ensuite, vous pouvez faire quelque chose comme:

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

Ce qui rend cette approche supérieure à une “fonction d’impression” pour la structure, c’est que vous pouvez utiliser les macros avec n’importe laquelle des fonctions de la famille printf que vous aimez et combiner l’impression d’autres données.

Vous pourriez devenir encore plus amateur et faire à la place:

 #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 

Vous pouvez ensuite utiliser la précision par défaut ou choisir une précision personnalisée.

Le préprocesseur C est-il assez puissant pour effectuer cette transformation?

Oui, c’est vrai, mais vous devez ensuite répéter la déclaration de structure entière dans la macro, ce qui va à l’encontre du but recherché. Vous pourriez avoir quelque chose comme ça:

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

et alors vous auriez besoin d’une implémentation assez complexe de cette macro, avec beaucoup, beaucoup de macros / fonctions d’assistance.

Non, le préprocesseur C est principalement un outil de remplacement de macro textuel. Il ne sait pas sur les types et les structures de C.

Vous ne pouvez pas itérer sur les membres de la structure en C, ni dynamicment ni statiquement (ni en C ++). Il n’y a pas de reflet en C.

Ainsi, il n’y a aucun moyen de faire en sorte que le préprocesseur effectue cette transformation.

Vous pouvez faire une macro pour ça:

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

puis imprimez-le comme ceci:

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

Vous voudrez peut-être en définir plusieurs pour couvrir différents types (par exemple, des flottants, des doublons, une impression hexadécimale). Malheureusement, il n’existe aucune solution de contournement satisfaisante car C preprecossor n’a aucune idée de ce que sont les types. Par exemple, vous ne pouvez pas utiliser un switch(typeof(M)) { case int: printf(.."%d"..; break; ...} tel que switch(typeof(M)) { case int: printf(.."%d"..; break; ...} .