202 votes

__FICHIER__ macro montre chemin d'accès complet

La norme MACRO prédéfinie __FICHIER__ disponible en C montre le chemin complet vers le fichier. Est-il un moyen de court-circuiter le chemin? Je veux dire au lieu de

/full/path/to/file.c

Je vois

to/file.c

ou

file.c

207voto

red1ynx Points 1221

Essayez

#include <string.h>

#define FILE (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

Pour Windows utiliser '\\' au lieu de '/'.

59voto

Patrick Points 485

Voici une astuce si vous êtes en utilisant cmake. De: http://public.kitware.com/pipermail/cmake/2013-January/053117.html

Je suis de la copie de la pointe donc tout est sur cette page:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__FILENAME__='\"$(subst
  ${CMAKE_SOURCE_DIR}/,,$(abspath $<))\"'")

Si vous utilisez GNU make, je ne vois aucune raison que vous ne pouvait pas étendre cette mesure à votre propre makefiles. Par exemple, vous pourriez avoir une ligne comme ceci:

CXX_FLAGS+=-D__FILENAME__='\"$(subst $(SOURCE_PREFIX)/,,$(abspath $<))\"'"

$(SOURCE_PREFIX) est le préfixe que vous souhaitez supprimer.

Ensuite, utilisez __FILENAME__ à la place de __FILE__.

3voto

Sean Points 22088

Il n'y a aucun moment de la compilation façon de le faire. Évidemment, vous pouvez le faire au moment de l'exécution à l'aide de la C runtime, comme certains des autres réponses ont démontré, mais au moment de la compilation, lors de la pré-procesor coups de pied, vous êtes hors de la chance.

3voto

hmjd Points 76411

Une légère variation sur ce @red1ynx proposé pourrait être de créer la macro suivante:

#define SET_THIS_FILE_NAME() \
    static const char* const THIS_FILE_NAME = \
        strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__;

Dans chacune de vos .c(pp) des fichiers à ajouter:

SET_THIS_FILE_NAME();

Alors vous pouvez vous référer THIS_FILE_NAME au lieu de __FILE__:

printf("%s\n", THIS_FILE_NAME);

Cela signifie que la construction est effectuée une fois par .c(pp) fichier au lieu de chaque fois que la macro est référencé.

Il est limité à l'utilisation de seulement de .c(pp) des fichiers et serait inutilisable à partir de fichiers d'en-tête.

0voto

ziu Points 1289

Puisque vous utilisez GCC, vous pouvez profiter de

__BASE_FILE__ Cette macro se développe pour le nom de la principale entrée de fichier, sous la forme d'une chaîne C constante. C'est le fichier source qui a été spécifié sur la ligne de commande du préprocesseur ou compilateur C

et de contrôler la manière dont vous souhaitez afficher le nom de fichier en modifiant le fichier source de la représentation (chemin d'accès complet/chemin relatif/basename) au moment de la compilation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X