2010-03-15 6 views
2

Je me demande s'il est possible d'afficher le chemin complet du fichier en utilisant la macro assert? Je ne peux pas spécifier le chemin complet du fichier dans la commande de compilation, y a-t-il toujours un moyen de le faire?Chemin complet du fichier C/C++ dans la macro assert

Mon environnement de débogage est linux/g ++

+0

Voulez-vous dire le chemin complet du fichier l'affirmation qui a échoué est contenue dans? –

+0

@Neil oui, autant que je peux dire assert.h utilise __FILE__. Idéalement, voudrais une façon portable d'imprimer le chemin complet du fichier lorsque l'assertion a échoué – Anycorn

+2

Portably, je pense que vous n'avez pas de chance. –

Répondre

0

assert utilise la macro __FILE__ pour obtenir le nom de fichier. Il s'étendra au chemin utilisé lors de la compilation. Par exemple, en utilisant ce programme:

#include <stdio.h> 
int main(void) 
{ 
    printf("%s\n", __FILE__); 
    return 0; 
} 

Si je compilez avec gcc -o foo foo.c 'et courir, je vais obtenir cette sortie:

foo.c 

Mais si je compile avec' gcc -o foo /tmp/foo.c » et courir, je vais cette sortie à la place:

/tmp/foo.c 
+0

merci, je sais à ce sujet. Cependant, je ne peux pas spécifier le chemin complet sans réécrire autoconf – Anycorn

+0

Voir http://www.gnu.org/software/hello/manual/autoconf/Particular-Headers.html. Que voulez-vous dire par "sans réécrire autoconf"? – Yktula

+0

@Yktula lorsque vous compilez avec autoconf/automake, les chemins de fichiers relatifs sont utilisés. – Anycorn

4

Vous pouvez ajouter l'option macro suivante dans votre ligne de compilation (peut être facilement modifier pour votre environnement)

%.o: %.cpp 
    $(CC) $(CFLAGS) -D__ABSFILE__='"$(realpath $<)"' -c $< -o [email protected] 

alors il vous suffit de cela pour avoir votre chemin complet:

#include <stdio.h> 
int main() 
{ 
    printf(__ABSFILE__); 
    // will be expanded as: printf("/tmp/foo.c") 
} 

EDIT

Encore mieux que cela: Les règles suivantes suffisent !!!

%.o: %.cpp 
    $(CC) $(CFLAGS) -c $(realpath $<) -o [email protected] 

Et vous pouvez maintenant utiliser __FILE__ macro:

#include <stdio.h> 
int main() 
{ 
    printf(__FILE__); 
    // will be expanded as: printf("/tmp/foo.c") 
} 
+0

Vous pouvez toujours redéfinir la macro ' __FILE__' au lieu de '__ABSFILE__'. Je ne le recommande pas (ery laid) – Phong

+1

Cela fonctionnera, mais il donnera des résultats confus pour le code dans les fichiers d'en-tête - il s'étendra au nom du fichier source qui comprend l'en-tête, pas le fichier d'en-tête lui-même. –

+0

@adam: +1 Vous avez raison, j'ai trouvé un autre moyen de le faire (cf éditer la partie). Ça devrait aller bien maintenant. – Phong

Questions connexes