C++ concaténation __FILE__ et __LINE__ macros?
Je veux mon exception des messages contenant des informations relatives à l'exception de l'emplacement.
Donc je voudrais avoir quelques chose comme cela.
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
Qui définissent est manifestement inexact. Comment atteindre cet objectif?
- Remarque: Vous pouvez simplifier l'exception de la construction de
std::exception( "ABCD." LOCATION )
. - vous pouvez jetez un oeil ici stackoverflow.com/questions/1739102/...
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour développer cette macro à deux niveaux:
Pourquoi?
Réponse courte: Vous avez besoin d'élargir
__LINE__
en deux niveaux, avant de passer à#x
.Réponse longue: tout d'Abord, l'aide de l'opérateur
#
dans un fonction-comme macro, il doit suivie par un paramètre de la macro mais__LINE__
n'est pas un paramètre, alors le compilateur se plaint c'est un parasite de l'opérateur.Deuxième,
__LINE__
lui-même est une macro et contient le numéro de ligne en cours, il devrait être élargi pour le numéro avant de l'utiliser avec#
, sinon, vous obtiendrez chaîne"__LINE__"
au lieu d'un nombre.Macro
S2(__LINE__)
étend__LINE__
à un numéro de ligne, puis nous passons le numéro de la ligne à#x
.BOOST_PP_STRINGIZE(__LINE__)
fait que, dans le cas où vous ne souhaitez pas créer vos propres macros S1 et S2.