Estoy (estaba) usando las macros __FILE__
y __LINE__
para imprimir mensajes de diagnóstico fuera de mi código. Esto funciona bastante bien cuando utiliza GCC con make, el archivo es tan corto como lo especificó en la línea de comando. Recientemente cambié al uso de CodeLite que utiliza nombres de archivo totalmente calificados (al menos en Windows) al construir. De repente, mi salida de diagnóstico casi no es legible.¿Cómo obtener solo el nombre del archivo en el preprocesador?
¿Hay alguna manera de obtener solo el componente de archivo del nombre de archivo en el preprocesador? Puedo vivir con una solución específica de GCC no portátil. (Me volveré a llamar a __FILE__
otros casos.)
Claro que puedo pasar el contenido de __FILE__
a través de una función y extraer solo el componente de archivo, pero las operaciones de cadena no era lo que tenía en mente para mensajes de diagnóstico que no deberían cambiar comportamiento en tiempo de ejecución ...
NOTA: Utilizo el nombre de archivo de la forma en que GNU lo usa. Una ruta de acceso es una colección de nombres de archivo y un nombre de archivo es un identificador relativo o absoluto de un archivo. Un nombre de archivo puede estar compuesto por un componente de directorio y un componente de archivo.
Los diagnósticos cambian el comportamiento del tiempo de ejecución (de lo contrario no habría diagnósticos) y si llama a una función adicional tiene poca importancia, ya que la salida está llamando a las funciones de la biblioteca para hacer la salida de todos modos. – eudoxos
Imprimir un mensaje de diagnóstico generalmente implica, además de docenas de operaciones de cadena, algunas acciones de E/S de archivo no tan benignas. Por alguna razón, nadie parece estar preocupado por esto. ¿Por qué preocuparse por agregar una llamada a otra función libre de efectos secundarios que solo afecta los mensajes de diagnóstico? –
Ambos tienen razón, agregar diagnósticos no tiene ningún efecto. Lo implementé de esa manera, lo dejé pasar por una función. Me preguntaba más si algo así existe. Seguro que no es estándar, pero encontrar documentación sobre esto no es perfecto. (Incluso el manual de gcc no describe todas las macro predefinidas). – rioki