La concaténation de jetons utilisant ## ne fonctionne pas?

#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 .