#define DECLARE_TYPE(T) \ typedef struct \ { \ float value; \ int scale; \ } ae_T##_t; DECLARE_TYPE(Q25);
Cela devrait créer le type ae_Q25_t
, mais cela ne fonctionne pas.
Comment réécrire?
Tout d’abord, naturellement, il devrait être ae_##T##_t
. Notez que _
caractère en C n’est pas un ponctuateur, mais un caractère “texte” standard (par opposition à, disons :
,,, espace et autres). Cela signifie que ae_T
est considéré par le préprocesseur comme un seul jeton indivisible continu, et non comme ae
suivi de _
et suivi de T
Deuxièmement, gardez à l’esprit que cela ne fonctionnera pas comme prévu si, par exemple, Q25
est lui-même une macro et que vous souhaitez le remplacer. Pour résoudre ce problème, vous avez besoin d’une définition de macro à deux niveaux.
#define DECLARE_TYPE_(T) \ typedef struct \ { \ float value; \ int scale; \ } ae_##T##_t; #define DECLARE_TYPE(T) DECLARE_TYPE_(T)
Mais si vous voulez que DECLARE_TYPE(Q25)
résolve toujours en ae_Q25_t
spécifiquement, vous êtes bon tel ae_Q25_t
.