8
votes

g ++ __fonction__ Remplacer le temps

Quelqu'un peut-il dire quand g ++ remplace la fonction __ __ 'macro' avec la chaîne contenant le nom de la fonction? Il semble que cela puisse la remplacer, pas avant d'avoir vérifié la correction syntaxique du code source, c'est-à-dire que c.-à-d. Ce qui suit ne fonctionnera pas xxx

car après prétraitement en utilisant xxx

La source ressemble à xxx

et maintenant le compilateur jette à juste titre car la ligne * ed est incorrecte.

y a-t-il de moyen Pour forcer ce remplacement avec une chaîne à une étape antérieure afin que la ligne soit correcte?

est __ fonction __ vraiment remplacé par une chaîne après tout? Ou est-ce une variable dans le code compilé?


0 commentaires

7 Réponses :


3
votes

Vous utilisez __ fonction __ comme une macro de préprocesseur, mais c'est une variable (veuillez lire http://gcc.gnu.org/onlinedocs/gcc/function-names.html ).

Essayez printf ("% s", __fonction __) juste pour tester et imprimera le nom de la fonction.


0 commentaires

2
votes

__ fonction __ n'est pas standard. Utilisez __ func __ . Comme le Documentation dit , c'est comme si: xxx


0 commentaires

2
votes

en C / C ++, le pré-processeur allumera "mon" "nom" "est" "BOB" dans le littéral "mon nom est BOB" ; Etant donné que __ fichier __ et __ ligne __ sont des instructions de préprocesseur, "Nous sommes en ligne" __line __ passera "Nous sommes en ligne 27" au compilateur. < / p>

__ fonction __ est normalement un synonyme de __ func __ . __ FUNC __ peut être considéré comme une pseudo-fonction qui renvoie le nom de la fonction dans laquelle elle s'appelle. Cela ne peut être fait que par le compilateur et non par le préprocesseur. Parce que __ func __ n'est pas évalué par le préprocesseur, vous n'obtenez pas la concaténation automatique. Donc, si vous utilisez printf il doit être effectué par printf ("Le nom de la fonction est% s", __func __);


0 commentaires

15
votes

Y a-t-il un moyen de forcer ce remplacement avec une chaîne à une étape antérieure afin que la ligne soit correcte?

Non. __ fonction __ (et sa contrepartie normalisée, __ func __ ) sont compilateur constructions. __ fichier __ et __ ligne __ en revanche, sont préprocesseur constructions. Il n'ya aucun moyen de faire fonctionner __ __ une construction de préprocesseur car le préprocesseur n'a aucune connaissance de la langue C ++. Lorsqu'un fichier source est prétraité, le préprocesseur n'a absolument aucune idée de laquelle fonction il regarde car il n'a même pas de concept de fonctions.

D'autre part, le préprocesseur fait connais quel fichier il travaille, et il sait également quelle ligne de fichier à laquelle il examine, il est donc capable de gérer __ file__ et __ ligne __ .

C'est pourquoi __ func __ est défini comme étant équivalent à une variable locale statique (c'est-à-dire un compilateur construction); Seul le compilateur peut fournir cette fonctionnalité.


0 commentaires

1
votes

Est-ce ce que vous voulez? XXX

REMARQUE: Puisque vous l'avez marqué comme C ++, vous devez probablement utiliser IOSTREAMS pour vous assurer que son type est sécurisé.


3 commentaires

Malheureusement, cela ne permet pas quelque chose comme dbg_whereami ("code d'erreur% d", code de code) . Il ne peut pas être fait pour fonctionner, non plus (au moins pas de manière non confortable) car C ++ n'a pas (encore) des macros variadiques.


Pas tout à fait ... Je me demandais si je pouvais générer une chaîne contenant Func au moment de la compilation, de sorte que c'est une constante d'exécution. cela semble être impossible.


@BBB: C'est statique const , et il n'ya aucune chance de générer au moment de l'exécution.



0
votes
printf("%s" __FILE__ __LINE__ "\n", __FUNCTION__);
Yeah, I know that's not really the same.

0 commentaires

0
votes

Notez que si vous créez une classe, vous pouvez créer un message à partir de n'importe quel nombre de types que vous le souhaitez, ce qui signifie que vous avez un effet similaire au << Opérateur ou au format dans un PrintF (3C). Quelque chose comme ceci: xxx

Notez que vous pouvez déclarer les << opérateurs au lieu de la (). Dans ce cas, l'utilisation résultante serait une chose comme ceci: xxx

dépend que vous préférez utiliser. J'aime un peu () parce qu'il protège vos expressions automatiquement. c'est-à-dire si vous voulez produire "compter" << 3 ", vous devez écrire: xxx


0 commentaires