Comment évaluer une macro de préprocesseur nestede

Supposons que je souhaite sélectionner le comportement d’une directive du préprocesseur donnée en évaluant, au moment de la compilation, la concaténation d’une chaîne constante et le résultat d’une autre macro.

#define CASE1 text1 #define CASE2 text2 #define CASE3 text3 #define SCENARIO 3 /** the following won't work - for examplification purposes only**/ #define FUNCTION CASE##SCENARIO /** whenever I write FUNCTION, I expect to see text3 **/ 

J’ai du mal à penser à une solution viable, car le pré-processeur est une bête à un passage. Est-ce même faisable?

C’est possible, il vous suffit d’append des couches supplémentaires de macros. La clé est que lorsque vous utilisez l’opérateur de collage de jetons ## , le préprocesseur ne développe pas ses opérandes. Toutefois, si vous ajoutez une autre couche de macros, le préprocesseur développera ces arguments. Par exemple:

 #define CASE1 text1 #define CASE2 text2 #define CASE3 text3 #define SCENARIO 3 #define TOKENPASTE_HELPER(x, y) x ## y #define TOKENPASTE(x, y) TOKENPASTE_HELPER(x, y) #define FUNCTION TOKENPASTE(CASE, SCENARIO) 

Lorsque le préprocesseur étend FUNCTION , il étend TOKENPASTE . Lorsqu’il étend TOKENPASTE , il étend ses arguments ( SCENARIO est donc remplacé par 3 ), car aucun de ses arguments n’est un opérande de l’opérateur de collage de jetons. Ensuite, il développe TOKENPASTE_HELPER , qui effectue le collage de jetons pour créer CASE3 . Enfin, il développe la macro CASE3 pour obtenir du text3 .