7
votes

Comment utiliser __file__ et __line__ comme paramètres par défaut dans un constructeur en C ++?

J'essaie d'utiliser le fichier __ et __ ligne __ macros dans un constructeur comme paramètres par défaut, mais je ne semble pas que les macros utilisent les bons fichiers . Ils continuent de se développer de mon fichier d'en-tête.

Plus en détail: J'aimerais avoir le fichier et le numéro de ligne d'où un objet est instancié en tant que membres de ma classe. Mais je ne veux pas devoir aller et mettre les paramètres à la main à chaque fois que je veux utiliser les objets. Je sais qu'il y a un moyen de faire ça, mais je ne peux pas pour la vie de moi la comprendre. Ce que je fais actuellement est ce que je fais actuellement:

dans mon fichier d'en-tête: xxx

mais, fichier et Ligne se développer comme s'ils provenaient de mon fichier d'en-tête, pas l'emplacement réel que j'utilise le MnNumber.

Pour répondre à la question de savoir pourquoi je voudrais faire cela, je veux Demandez au code de lire son propre codePage. Les valeurs particulières que j'utilise sont enregistrées dans un gestionnaire et leur valeur est autorisée à être modifiée par l'utilisateur final. Lorsque l'utilisateur final est effectué modifier la valeur, la valeur est écrite dans la page Code. Donc, j'ai besoin de savoir où est venu la valeur. Je permet également à l'utilisateur final de dire qu'ils n'auront jamais besoin d'éditer cette valeur, et lorsqu'ils cliquent sur ce bouton, la valeur est convertie d'un dos de dos dans un flotteur et le type sur le code de code est réécrit comme un flotteur. . Ou, sera ... j'espère.

Un conseil pour moi?


3 commentaires

Réponse courte: Vous ne pouvez pas les utiliser dans la façon dont vous voulez. Ils se développent à l'emplacement que le code source du constructeur est écrit, c'est ainsi que le prétraitement fonctionne. C'est un moteur de traitement de texte qui ne connaît rien sur «Paramètres de fonction» et les goûts. Le compilateur, la chose qui traite réellement de fonctions, d'arguments, etc. vient après la fin du préprocesseur.


Vous devez utiliser des macros au lieu du constructeur. Cela ne fonctionnera tout simplement aucune autre solution. Cela signifie qu'il échoue complètement sur le code générique, par exemple.


Et mon manager est un singleton? Solution intelligente!


3 Réponses :


2
votes

Vous ne pouvez pas faire cela - ces deux macros sont substitués par le préprocesseur lorsqu'il les rencontre, de sorte qu'ils seront échangés vers le nom du fichier d'en-tête et le linenumber.


0 commentaires

8
votes

Vous pouvez le faire avec le préprocesseur. Créer une macro qui se développe à __ ligne __ et utilisez-le: xxx


0 commentaires

0
votes

L'OP a écrit dans une édition:

Ce n'était pas facile, mais R. Martinho Fernandes m'a mis sur le bon chemin. Et je ne pense pas que ce soit Threadsafe, mais ça marche jusqu'à présent. P>

Ce que je voulais, c'était la possibilité de suivre et de mettre à jour des flotteurs simplement en changeant le type à MnFloat. Et j'ai défini une définition qui appelle une fonction dans mon gestionnaire pour ajouter les noms de fichiers, de ligne et de fonction, puis modifie le flotteur sur mon type spécial. À l'intérieur du gestionnaire, ils sont tous liés avec un identifiant. Lorsque j'appelle la fonction de registre, je crée un objet en interne que je stocke. Sur la même ligne, mon type spécial est également créé et il s'enregistre avec le gestionnaire. Les deux objets utilisent le même type de système d'identification (ID's Get générés par la copie à partir d'un numéro statique que j'y accroître chaque fois qu'un nouvel objet est créé). Comme ils apparaissent sur la même page de code, les identifiants sont toujours les mêmes et ne sortent jamais de synchronisation. En supposant que je ne passe pas multithreadé, je suppose. On a l'impression de tricher, mais cela fonctionne :) p>

Voici comment ça fonctionne. Je prends ceci: p>

#define mnFloat myManager::getInstance()->register(__FILE__,__FUNCTION__,__LINE__);mnNumber


1 commentaires

( répondit dans une question Modifier et converti en Wiki Community )