Obtener el nombre base del archivo fuente en tiempo de compilación

 C Programming >> Programación C >  >> Tags >> File
Obtener el nombre base del archivo fuente en tiempo de compilación

Si estás usando un make programa, debería poder cambiar el nombre del archivo de antemano y pasarlo como una macro a gcc para ser utilizado en su programa. Por ejemplo, en tu makefile , cambie la línea:

file.o: file.c
    gcc -c -o file.o src/file.c

a:

file.o: src/file.c
    gcc "-DMYFILE=\"`basename $<`\"" -c -o file.o src/file.c

Esto le permitirá usar MYFILE en tu código en lugar de __FILE__ .

El uso de basename del archivo fuente $< significa que puede usarlo en reglas generalizadas como .c.o . El siguiente código ilustra cómo funciona. Primero, un makefile :

mainprog: main.o makefile
    gcc -o mainprog main.o

main.o: src/main.c makefile
    gcc "-DMYFILE=\"`basename $<`\"" -c -o main.o src/main.c

Luego un archivo en un subdirectorio, src/main.c :

#include <stdio.h>

int main (int argc, char *argv[]) {
    printf ("file = %s\n", MYFILE);
    return 0;
}

Finalmente, una transcripción que muestra su funcionamiento:

pax:~$ mainprog
file = main.c

Tenga en cuenta el file = línea que contiene solo el nombre base del archivo, no el nombre del directorio también.


No sé de una manera directa. Podrías usar:

#line 1 "filename.c"

en la parte superior del archivo fuente para establecer el valor de __FILE__ , pero no estoy seguro de que eso sea mucho mejor que codificarlo. o simplemente usando #define para crear tu propia macro.

Otra opción podría ser pasar el nombre de su Makefile usando -D y $(shell basename $<)

Editar:si usa #define o la opción -D, debe crear su propio nombre nuevo y no intentar redefinir __FILE__ .


Considere este código fuente simple:

#include <stdio.h>
int main(void)
{
    puts(__FILE__);
    return(0);
}

En Solaris, con GCC 4.3.1, si compilo esto usando:

gcc -o x x.c && ./x

la salida es 'x.c ' Si lo compilo usando:

gcc -o x $PWD/x.c && ./x

luego __FILE__ se asigna a la ruta completa ('/work1/jleffler/tmp/x.c '). Si lo compilo usando:

gcc -o x ../tmp/x.c && ./x

luego __FILE__ se asigna a '../tmp/x.c '.

Entonces, básicamente, __FILE__ es el nombre de la ruta del archivo fuente. Si construye con el nombre que desea ver en el objeto, todo está bien.

Si eso es imposible (por el motivo que sea), tendrá que buscar las soluciones sugeridas por otras personas.