C/C++ numéro de ligne
Dans le souci des fins de débogage, puis-je obtenir le numéro de la ligne dans C/compilateurs C++?
(de façon standard ou des moyens spécifiques pour certains compilateurs)
e.g
if(!Logical)
printf("Not logical value at line number %d \n",LineNumber);
//How to get LineNumber without writing it by my hand?(dynamic compilation)
- Certains d'entre nous préfèrent ne pas salir avec les débogueurs. Ce genre de "personne pauvre instruction assert" est parfois plus clair, car c'est un élément permanent du code, et durable de la documentation de choses qui devraient être vrai à propos de l'état du calcul.
- Débogueurs sont également moins utile pour les problèmes intermittents dans les programmes de longue date, ou pour la collecte de renseignements sur les problèmes de logiciels déployés sur les sites des clients. Dans ces cas, la seule option est pour le programme à se connecter autant d'informations sur l'état du programme que possible, pour une analyse ultérieure.
- Et débogueurs ne fonctionnent pas si bien sur certains systèmes embarqués pour obtenir cette information.
- Lucas: Parce que la question était à propos de l'impression de la ligne de numéros. Ne changez pas la question. Je SOUHAITE qu'il y avait une certaine façon de voter des commentaires comme ça, ils sont extrêmement ennuyeux.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le préprocesseur macro
__LINE__
et__FILE__
. Ils sont des macros prédéfinies et une partie de la C/C++ standard. Lors du pré-traitement, ils sont remplacés respectivement par une constante chaîne de caractères contenant un entier représentant le numéro de ligne en cours et par le nom du fichier en cours.Autres préprocesseur variables :
__func__
: nom de la fonction (c'est la partie de C99, pas tous les compilateurs C++ soutenir)__DATE__
: une chaîne de caractères de la forme "Mmm jj aaaa"__TIME__
: une chaîne de caractères de la forme "hh:mm:ss"Votre code sera :
__LINE__-1,
dans l'exemple de cette réponse?char *convert_line_number(unsigned long line) { char line_string[15]; sprintf(&line_string, "%ul", line); return (&line_string);
Appeler de la sorte:int main(int argc, char **argv) { printf("%s", convert_line_number(__LINE__); return (0); }
#define S1(N) #N
#define S2(N) S1(N)
#define LINESTR S2(__LINE__)
. Voir c-faq.com/ansi/stringize.html__func__
n'est pas une macro, il est implicitement une variable déclarée.These identifiers are variables, not preprocessor macros, and may not be used to initialize char arrays or be concatenated with string literals.
(voir gcc.gnu.org/onlinedocs/gcc/Function-Names.html)Dans le cadre de la norme C++, il existe des macros prédéfinies que vous pouvez utiliser. Section 16.8 du standard C++ définit, entre autres choses, la
__LINE__
macro.De sorte que votre code serait:
Vous pouvez utiliser une macro avec le même comportement que printf(),
sauf qu'il inclut également des informations de débogage comme
nom de la fonction, la classe et le numéro de ligne:
Ces macros doivent se comporter de façon identique à printf(), tout en incluant java stacktrace-comme de l'information. Voici un exemple principal:
Qui aboutit à la sortie suivante:
#include
à<stdio.h>
Utilisation
__LINE__
(c'est le double-trait de soulignement de la LIGNE de double-trait de soulignement), le préprocesseur va le remplacer par le numéro de la ligne sur laquelle il est rencontré.Caisse
__FILE__
et__LINE__
macrosEssayer
__FILE__
et__LINE__
.Vous pouvez également trouver des
__DATE__
et__TIME__
utile.À moins que vous avez pour déboguer un programme sur le client et donc besoin de vous connecter à ces informations, vous devriez faire un usage normal de débogage.
raw code
(comme ceci: `__`). @mmyers tenté de l'aider, mais il n'échappe à l'un des traits de soulignement, et donc avec le balisage de la syntaxe de italique. Downvotes sont un peu dur ici, cependant, je suis d'accord.Depuis que je suis aussi confronté à ce problème maintenant et je ne peux pas ajouter une réponse à une autre mais aussi valide question posée ici,
je vais vous donner un exemple de solution pour le problème de:
seulement le numéro de la ligne où la fonction a été appelée en C++ à l'aide de modèles.
Contexte: en C++, on peut utiliser des non-type de valeurs entières, comme un argument de modèle. Ce qui est différent de l'utilisation typique de types de données comme arguments de modèle.
L'idée est donc d'utiliser ces valeurs entières pour un appel de fonction.
De sortie:
Une chose à mentionner ici est que, en C++11, il est possible de donner du modèle par défaut des valeurs pour les fonctions à l'aide de modèle. En avant C++11 valeurs par défaut pour les non-type des arguments semblent ne fonctionnent que pour le modèle de classe d'arguments. Ainsi, en C++11, il n'y aurait pas besoin d'avoir de doublons de définitions de fonction comme ci-dessus. En C++11 est également valable pour avoir const char* modèle arguments mais ce n'est pas possible de les utiliser avec des littéraux comme
__FILE__
ou__func__
comme mentionné ici.Donc en fin de compte, si vous êtes à l'aide de C++ ou C++11, cela pourrait être une alternative très intéressante que l'utilisation de la macro pour obtenir de l'appelant.