Est-il un moyen de faire un #define à l'intérieur d'un autre #define?
Je sais que je suis en train de me tirer une balle dans la jambe 😉 Cependant, il me permettra de faire le reste (grande quantité) de code plus compact et plus lisible.
Est-il de toute façon délicate pour créer des macro préprocesseur à l'intérieur d'une autre macro préprocesseur?
Voici l'exemple, ce que je suis à la recherche d'. Mon vrai scénario est plus complexe
//That's what I want to do and surely C++ doesn't like it.
#define MACROCREATER(B) #define MACRO##B B+B
void foo()
{
MACROCREATOR(5) //This should create new macro (#define MACRO5 5+5)
int a = MACRO5; //this will use new macro
}
Vous devez vous connecter pour publier un commentaire.
La Norme C++ dit (16.3.4.3):
Donc non, il n'est pas "officiel" de manière à réaliser ce que vous voulez avec des macros.
Pas. Même si une macro se développe en quelque chose qui ressemble à un prétraitement de la directive, l'expansion n'est pas évalué en tant que prétraitement de la directive.
Comme un complément aux réponses ci-dessus, si vous vraiment voulu pour pré-traiter un fichier source deux fois—ce qui est presque certainement pas ce que vous voulez vraiment le faire—vous pouvez toujours appeler votre compilateur comme ceci:
Qui est, exécutez le fichier par le préprocesseur, puis exécutez la séquence de sortie via un tuyau à travers une compilation complète de routine, y compris une deuxième étape de prétraitement. Dans l'ordre pour que cela ait une bonne chance de travailler, j'imagine que vous auriez à être plutôt prudent dans la façon dont vous avez défini et utilisé vos macros, et dans l'ensemble, il ne serait probablement pas la peine et augmentation de la durée de la construction.
Si vous voulez vraiment les macros, l'utilisation de la macro standard à base de solutions. Si vous voulez vraiment le temps de compilation métaprogrammation, utiliser des modèles.
Sur une légère note, cela me rappelle le fait que le raytracing langue POV-Ray a fait un usage intensif d'une assez complexe de prétraitement de la langue, avec le contrôle du flux de directives telles que
#while
qui a permis conditionnel répétition, au moment de la compilation des calculs, et d'autres goodies. Serait-ce c'était le cas en C++, mais il n'est tout simplement pas le cas, nous venons de le faire d'une autre manière.Pas. Le pré-processeur est un seul passage. Il n'a pas re-évaluer l'expansion des macros.
Comme indiqué, on peut #include d'un fichier particulier plus d'une fois avec différentes définitions de macro active. Cela peut être pratique pour obtenir certains effets qui ne pouvait pas être pratiquement atteint par tout autre moyen.
Comme un exemple simple, sur de nombreux systèmes embarqués pointeur d'adressage indirect est très cher par rapport à la variable directe d'accès. Code qui utilise beaucoup d'indirection de pointeur peut très bien être deux fois plus gros et lent comme un code qui utilise simplement des variables. Par conséquent, si un particulier de routine est utilisé avec deux ensembles de variables, dans un scénario où l'on aurait généralement de passer un pointeur sur une structure, puis utiliser la flèche de l'opérateur, il peut être beaucoup plus efficace, simple à mettre de la routine dans son propre fichier (j'ai l'habitude de l'utilisation de l'extension .i) qui est inclus une fois sans macro _PASS2 défini, et une deuxième fois avec. Ce fichier peut ensuite #ifdef _PASS2/#else de définir des macros pour toutes les variables doivent être différentes sur les deux passes. Même si le code est généré par deux fois, sur certains micros qui prendra moins de place qu'à l'aide de la flèche de l'opérateur avec le passé-pointeurs.
Prendre un coup d'oeil à m4. Il est semblable à du rpc, mais récursive et beaucoup plus puissant. J'ai utilisé m4 pour créer un structuré de la langue pour les assembleurs, par exemple
Le "si", "else" et "fin" sont des appels de macros m4, j'ai écrit que générer des sauts et des étiquettes, le reste est originaire de l'assemblée. Afin d'imbriquer ces if/else/fin des constructions, vous avez besoin de ne définit à l'intérieur d'une macro.