Quelqu'un peut-il dire quand g ++ remplace la fonction car après prétraitement en utilisant p> La source ressemble à p> et maintenant le compilateur jette à juste titre car la ligne * ed est incorrecte. P> y a-t-il de moyen Pour forcer ce remplacement avec une chaîne à une étape antérieure afin que la ligne soit correcte? p> est __ __ code> '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
__ fonction __ code> vraiment remplacé par une chaîne après tout? Ou est-ce une variable dans le code compilé? P> p>
7 Réponses :
Vous utilisez Essayez __ fonction __ code> comme une macro de préprocesseur, mais c'est une variable (veuillez lire http://gcc.gnu.org/onlinedocs/gcc/function-names.html ). P>
printf ("% s", __fonction __) code> juste pour tester et imprimera le nom de la fonction. P>
__ fonction __ code> n'est pas standard. Utilisez
__ func __ code>. Comme le Documentation dit , c'est comme si:
en C / C ++, le pré-processeur allumera "mon" "nom" "est" "BOB" code> dans le littéral
"mon nom est BOB" code>; Etant donné que
__ fichier __ code> et
__ ligne __ code> sont des instructions de préprocesseur,
"Nous sommes en ligne" __line __ code> passera "Nous sommes en ligne 27" au compilateur. < / p>
__ fonction __ code> est normalement un synonyme de
__ func __ code>.
__ FUNC __ CODE> 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 __ code> n'est pas évalué par le préprocesseur, vous n'obtenez pas la concaténation automatique. Donc, si vous utilisez
printf code> il doit être effectué par
printf ("Le nom de la fonction est% s", __func __); code> p> P>
Y a-t-il un moyen de forcer ce remplacement avec une chaîne à une étape antérieure afin que la ligne soit correcte? p> blockQuote>
Non.
__ fonction __ code> (et sa contrepartie normalisée,
__ func __ code>) sont compilateur em> constructions.
__ fichier __ code> et
__ ligne __ code> en revanche, sont préprocesseur em> constructions. Il n'ya aucun moyen de faire fonctionner
__ __ code> 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 em> il regarde car il n'a même pas de concept de fonctions. P>
D'autre part, le préprocesseur fait em> connais quel fichier il travaille, et il sait également quelle ligne de fichier à laquelle il examine, il est donc capable de gérer
__ file__ code> et
__ ligne __ code>. p>
C'est pourquoi
__ func __ code> est défini comme étant équivalent à une variable locale statique (c'est-à-dire un compilateur em> em> construction); Seul le compilateur peut fournir cette fonctionnalité. P>
Est-ce ce que vous voulez? REMARQUE: Puisque vous l'avez marqué comme C ++, vous devez probablement utiliser IOSTREAMS pour vous assurer que son type est sécurisé. P> P>
Malheureusement, cela ne permet pas quelque chose comme dbg_whereami ("code d'erreur% d", code de code) 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 B> au moment de la compilation, de sorte que c'est une constante d'exécution. cela semble être impossible.
@BBB: C'est statique const code>, et il n'ya aucune chance de générer au moment de l'exécution.
printf("%s" __FILE__ __LINE__ "\n", __FUNCTION__); Yeah, I know that's not really the same.
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: 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: p> 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: p>