Acabo de pensar en una gran solución para esto que funciona con archivos de origen y de encabezado, es muy eficiente y funciona en tiempo de compilación en todas las plataformas sin extensiones específicas del compilador. Esta solución también conserva la estructura de directorios relativa de su proyecto, para que sepa en qué carpeta se encuentra el archivo, y solo en relación con la raíz de su proyecto.
La idea es obtener el tamaño del directorio de origen con su herramienta de compilación y simplemente agregarlo a la __FILE__
macro, eliminando el directorio por completo y solo mostrando el nombre del archivo que comienza en su directorio de origen.
El siguiente ejemplo se implementa usando CMake, pero no hay razón para que no funcione con otras herramientas de compilación, porque el truco es muy simple.
En el archivo CMakeLists.txt, defina una macro que tenga la longitud de la ruta a su proyecto en CMake:
# The additional / is important to remove the last character from the path.
# Note that it does not matter if the OS uses / or \, because we are only
# saving the path size.
string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
En su código fuente, defina una __FILENAME__
macro que simplemente agregue el tamaño de la ruta de origen a la __FILE__
macro:
#define __FILENAME__ (__FILE__ + SOURCE_PATH_SIZE)
Luego use esta nueva macro en lugar de la __FILE__
macro. Esto funciona porque la __FILE__
ruta siempre comenzará con la ruta al directorio de origen de CMake. Al eliminarlo de la __FILE__
cadena, el preprocesador se encargará de especificar el nombre de archivo correcto y todo será relativo a la raíz de su proyecto CMake.
Si se preocupan por el rendimiento, esto es tan eficiente como el uso __FILE__
, porque ambos __FILE__
y SOURCE_PATH_SIZE
se conocen las constantes de tiempo de compilación, por lo que puede ser optimizado de distancia por el compilador.
El único lugar donde esto podría fallar es si está usando esto en archivos generados y están en una carpeta de compilación fuera del código fuente. Entonces probablemente tendrá que crear otra macro usando la CMAKE_BUILD_DIR
variable en lugar de CMAKE_SOURCE_DIR
.