2016-12-09 1 views
0

ATOMIC_JOIN(prefix, detail_platform) est une macro qui affichera une chaîne de caractères comme suit:Comment puis-sortie macro guillemets doubles

base/atomique/gcc_gnu_x64

dans un autre ATOMIC_DETAIL_HEADER macro, dont la sortie devrait être:

"base/atomique/gcc_gnu_x64.hpp" // avis: guillemets doubles inclus dans la sortie

J'essaie d'écrire le ATOMIC_DETAIL_HEADER, tels que:

#define ATOMIC_DETAIL_HEADER(prefix) "ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp" 

#define ATOMIC_DETAIL_HEADER(prefix) \"ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp\" 

#define ATOMIC_DETAIL_HEADER(prefix) "##ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp##" 

... a échoué!

mais si j'espère que la sortie est:

<base/atomic/gcc_gnu_x64.hpp>

La macro de suivi définissent peut faire bonne chose:

#define ATOMIC_DETAIL_HEADER(prefix) <ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp>

Répondre

0

Une macro cpp ne peut pas construire des chaînes de cette façon . Il peut joindre des jetons pour former de nouveaux jetons, mais à chaque étape il doit être un jeton valide. Votre exemple avec des parenthèses d'angle fonctionne parce que les caractères de parenthèse sont des jetons distincts alors que les guillemets doubles ne peuvent pas exister de manière flottante comme cela, et vous ne pouvez pas lui appliquer ##.

Dans la plupart des contextes, le compilateur va concaténer des littéraux de chaîne adjacents, donc il peut suffire de #stringify chaque partie pour que le compilateur fasse cela.