Comment puis-je utiliser la compilation constante de temps de l' _LIGNE ___ dans une chaîne de caractères?
Je peux utiliser __LINE__
comme un paramètre d'une méthode, mais je voudrais un moyen facile de l'utiliser dans une fonction qui utilise des chaînes de caractères.
Par exemple dire j'ai ceci:
11 string myTest()
12 {
13 if(!testCondition)
14 return logError("testcondition failed");
15 }
Et je veux le résultat de la fonction:
"myTest ligne 14: testcondition a échoué"
Comment puis-je écrire logError? A-t-elle être une monstruosité d'une macro?
OriginalL'auteur Mr. Boy | 2010-04-19
Vous devez vous connecter pour publier un commentaire.
Pourquoi avez-vous encore besoin d'elle comme une chaîne de caractères? Quel est le problème avec un entier? Voici deux façons que vous pourriez écrire
logError()
:Si vous avez vraiment besoin de la ligne comme une chaîne de caractères, vous pouvez utiliser le stringizing opérateur
#
, mais à cause de la façon dont les macros de travail, vous aurez besoin de l'envelopper dans deux macros:Et maintenant
LINE_STRING
est une macro qui permet de développer une chaîne de caractères contenant le numéro de ligne courant partout où il est étendu. Si vous n'aviez qu'un seul niveau de macros (c'est à dire si vous avez eu#define STRINGIZE(x) #x
), alors, vous obtiendrez la chaîne littérale"__LINE__"
chaque fois que vous l'avez agrandi, ce qui n'est pas ce que vous voulez.OriginalL'auteur Adam Rosenfield
Il n'y a pas de raison de le faire à tout moment de l'exécution de travaux pour cette:
Ou:
Si vous êtes une personne cool comme James.
STRINGIZE
, vous pouvez utiliserSTRINGIFICATE
et profiter de bizarre regards de vos collègues de travail.Dûment noté.
J'utilise le mot "stringify" pour ça 🙂
OriginalL'auteur GManNickG
Son but est de créer une macro (nommé logError) qui inclura automatiquement les symboles nécessaires et de faire la concaténation de chaîne dans le préprocesseur, en utilisant uniquement des littéraux de chaîne.
Donc, en combinant les gros-réponses correctes réponses jusqu'à présent, nous allons écrire la macro:
Vous pouvez ensuite utiliser cette macro n'importe où pour créer un message d'erreur générique code littéral de chaîne de format au moment de la compilation.
Remarque: Vous pouvez également utiliser
__FUNCTION__
(ou un équivalent, il varie en fonction du compilateur) au lieu de__FILE__
, si vous préférez, pour garder une trace du nom de la fonction à la place du nom de fichier.OriginalL'auteur Tim Leaf
Les options habituelles pour la mise en forme d'un nombre en une chaîne de caractères s'appliquent: Boost lexical_cast, ostringstream, sprintf ou snprintf, etc.
Ici est l'un de mes liens préférés sur le sujet: http://www.gotw.ca/publications/mill19.htm
OriginalL'auteur Fred Larson
Oui, c'est moche. Vous avez besoin d'une combinaison de macros. La conversion d'un entier en une chaîne de caractères est un processus en deux étapes - ici pour promouvoir la mise en œuvre:
Maintenant, vous pouvez générer une chaîne de caractères:
OriginalL'auteur Mark Ransom
Utilisation:
Vous pouvez ensuite faire une macro pour cela, si vous le souhaitez:
Et puis l'utilisation serait:
OriginalL'auteur Brian Neal
devrait le faire c style. Je sais qu'il existe des moyens et des façons de le faire avec le C++ bibliothèques de chaînes de caractères.
Vous pouvez également utiliser strcat() ou strncat ou tout autre nombre de C libs pour ce faire.
fonctionnera aussi bien.
Pourquoi ne pas simplement
cout << "String" << __LINE__ << "Another string";
? Pas besoin de moulage ou de la concaténation.Ce n'est pas clair à partir de votre question.
Je sais qu'il existe C++ string méthodes que la surcharge de l'opérateur+() pour effectuer de la chaîne de chats, j'ai juste n'était pas sûr de la syntaxe. J'ai toujours fait ces de style C...
non? Je ne parle pas de cout ou de la console de n'importe où. Modifier si vous le souhaitez.
OriginalL'auteur Michael Dorgan
Essayer ce?
OriginalL'auteur Dustin