web-dev-qa-db-fra.com

Préprocesseur C Macro définissant la macro

Pouvez-vous faire quelque chose comme ça avec une macro dans C ?

#define SUPERMACRO(X,Y) #define X Y

then

SUPERMACRO(A,B) expands to #define A B

J'ai l'impression que non, car le préprocesseur ne fait qu'un seul passage.

CCG officiel seulement. Aucun outil tiers s'il vous plaît.

41
Mike

Les macros ne peuvent pas se développer en directives de prétraitement. De C99 6.10.3.4/3 "Nouvelle numérisation et remplacement ultérieur":

La séquence de jetons de prétraitement complètement remplacée par macro résultante n'est pas traitée comme une directive de prétraitement même si elle en ressemble à une,

33
Michael Burr

Vous ne pouvez pas définir de macros dans d'autres macros, mais vous pouvez appeler une macro à partir de votre macro, ce qui peut vous donner essentiellement les mêmes résultats.

#define B(x) do {printf("%d", (x)) }while(0)
#define A(x) B(x)

donc, A(y) est développée en do {printf("%d", (y)) }while(0)

15
WhirlWind

Non. L'ordre des opérations est tel que toutes les directives du préprocesseur sont reconnues avant toute expansion de macro; ainsi, si une macro se développe en quelque chose qui ressemble à une directive de préprocesseur, elle ne sera pas reconnue comme telle, mais sera plutôt interprétée comme du texte source C (erroné).

3
John Bode

Désolé vous ne pouvez pas. Vous pouvez appeler d'autres macros dans les macros mais pas en définir de nouvelles.

2
Tuomas Pelkonen

Vous pouvez essayer de l'exécuter uniquement avec l'option de prétraitement, puis de compiler avec le fichier prétraité.

1
user922475

Vous pouvez le faire cependant: #define SUPERMACRO (X, Y) définir X Y

Ensuite, vous pouvez utiliser la fonctionnalité de macro-expansion de vos éditeurs et coller le # manquant.

Ou encore mieux: utilisez un langage de traitement de chaîne différent et plus puissant comme préprocesseur.

0
user2096143