Le fichier Toute pensée? (BTW, ceci est pour une application C ++). p>
mise à jour: Pour être clair, je suis après une macro qui me donnera une chaîne contenant le nom du répertoire à la compilée, je ne veux pas faire de traitement à la chaîne au moment de l'exécution. P> __ __ code> et
__ ligne __ code> Les macros sont intégrés au pré-processeur
5 Réponses :
Il n'y a pas de macro intégré pour cela, mais évidemment, vous pouvez écrire votre propre petite routine d'analyse qui prend un fichier et déchire le nom du répertoire pour un nom de fichier complet complet. Appelez cette fonction: alors vous pouvez faire une macro comme ceci: p> ce qui se comportera comme ce que tu veux ( Il vous donne une ficelle STD :: String au lieu d'un char * afin que le nettoyage est mieux défini) avec la sémantique pertinente (ses résultats dépend du fichier dans lequel il est invoqué, de sorte qu'il obtienne toujours le bon répertoire.) P > p>
La chose est que je veux que le "ParsystDir" ait lieu à la compilée (il n'y a aucune raison pour laquelle il ne peut pas, car fichier b> est prédéterminé). Je pensais peut-être quelque chose dans le boost :: MPL ou un autre modèle de hacky métaprogrammant à l'intérieur d'une macro pourrait me laisser le faire .. C'est pour une application plutôt critique de performance, et je ne veux pas perdre de temps à faire un traitement de chaîne inutile à Durée.
Woops, oublié à propos de Markdown devrait être _ fichier _ i>, pas fichier b>
Le problème est avec l'accès de la compilation aux littéraux à chaîne - cela n'est pas possible maintenant. On dirait que nous aurons un traitement de chaîne de compilation en C ++ 1x.
OK, mais ce que vous demandez est restreint par la définition de la langue elle-même. C ++ ne contient pas de véritable langage de métaprogrammation comme si vous avez besoin (apparemment LISP ne peut pas faire ce problème.) Une solution dans laquelle les personnes ont abordé de tels problèmes dans le passé consiste à écrire leur propre pré-processeur ou à utiliser d'autres personnes existantes.
J'avais l'impression que les modèles C ++ sont terminés. Donc, C ++ a un véritable métaprogrammation.
Eh bien, je pense que sa ture complète en ce qui concerne une entrée et une sortie de types et de code source. fichier b> n'est pas un code ni un type, mais une substitution textuelle spécifique. Pensez au fichier B> octets comme en dehors du "sablebox" du prétraiteur C ++ de la même manière que la mémoire directe est en dehors du bac à sable de Java (dans les deux cas, vous pouvez le simuler en code au moment de l'exécution ou Même l'accès des instances de celui-ci était de la cartographie intrinsèque, mais la vraie chose brute elle-même n'est pas accessible.)
Ce que vous voulez, c'est quelque chose de similaire à l'UNIX
__BASE_FILE__
Fermer, mais pas de cigare. Cela donne le nom de fichier / chemin comme passé à g ++, il varie donc certaines des parties antérieures du chemin, mais ne me donnent pas le dernier dir que je veux (puisque mon code est dans un groupe de sous-répertoires) , alors maintenant, je viens de recevoir Foo / Bar au lieu de / home / Davidc / Quelques / Path / To / Code / Foo / Bar, Fermer mais malheureusement toujours le même problème.
Dammit, si proche. Je vais aller continuer à regarder.
Selon votre compilateur / Comment votre logiciel est construit, vous pouvez déclarer une macro d'être la voie actuelle ou de tout chemin lorsque vous compilez. Je n'ai jamais utilisé le compilateur MS, mais je sais qu'il existe également une option similaire pour la CPI. P> GCC Manpage P> P>
Merci, mais ce n'est pas ce que je suis après. Je compile un vaste projet avec des centaines de fichiers dans différents répertoires, l'idée est que chaque fichier peut #include cette macro et renvoie le nom du répertoire correspondant à son emplacement de fichier source propre, je ne veux pas "dur- code 'le chemin vers n'importe où en particulier.
oh et oui j'utilise g ++ sur Linux
Que diriez-vous de changer votre système de makefile / de construction de sorte que pour ... / bar / file.cc code> La ligne de compilation comprendra
-d__dir__ bar code>. Il devrait être plus facile ... P>
Si vous utilisez gnu faire code> pour construire votre projet, vous pourrez peut-être faire quelque chose comme ceci:
%.o: %.cpp
$(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@
D'Oh, tu m'as battu par une minute - je faisais à peu près exactement la même chose. Cela ne fonctionne pas bien si le dernier répertoire dispose d'espaces, mais sinon c'est une solution parfaite. Et croyez-moi - j'ai vu loin i> pire monstruosités dans des fabricants de fabricants avant.
@ADAM: Je devais juste faire des fixes i> pour contourner les numéros de version commençant par Zeroes ce soir. Aller de 07,64 à 08.01 nous a fait beaucoup de chagrin inutile.
J'utilise CMAKE, alors je devrais pouvoir faire cela. Merci!
@ D.Shawley: Cela ne fonctionnerait que pour les fichiers à l'intérieur du même directeur Y comme unité de traduction. Je suppose que la seule solution est de remplacer le prétraiteur ou de suggérer une autre extension.