Suponiendo que su compilador de C ++ los admite, ¿hay alguna razón particular para no usarlos?__FILE__ , __LINE__y __FUNCTION__para fines de registro y depuración?
Me preocupa principalmente dar al usuario datos engañosos, por ejemplo, informar el número de línea incorrecto o la función como resultado de la optimización, o tomar un impacto en el rendimiento como resultado.
Básicamente, puedo confiar __FILE__, __LINE__y __FUNCTION__para siempre hacer lo correcto?
c++
debugging
logging
c-preprocessor
Runcible
fuente
fuente

Respuestas:
__FUNCTION__no es estándar,__func__existe en C99 / C ++ 11. Los otros (__LINE__y__FILE__) están bien.Siempre informará el archivo y la línea correctos (y funcionará si elige usar
__FUNCTION__/__func__). La optimización no es un factor ya que es una expansión de macro en tiempo de compilación; será no afectar al rendimiento de ninguna manera.fuente
__func__es un problema en C ++. C99 no dice una palabra sobre los argumentos predeterminados, etc., casos en los que no es tan obvio cómo__func__debería comportarse en C ++.__func__existe en c99, no en c ++. De todos modos, creo que una implementación razonable de__func__en c ++ solo daría como resultado el nombre destrozado. Como no soy un escritor compilador, en realidad no es mi decisión.__FUNCTION__en absoluto? ¿Qué compiladores, excepto gcc reciente, tratan esto como una variable, no como una macro?__func__ahora está en el estándar C ++ 11.En casos raros, puede ser útil cambiar la línea dada por
__LINE__otra cosa. He visto que GNU configure hace eso para algunas pruebas para informar los números de línea apropiados después de insertar un vudú entre líneas que no aparecen en los archivos fuente originales. Por ejemplo:Hará que las siguientes líneas comiencen con
__LINE__100. Opcionalmente, puede agregar un nuevo nombre de archivoRaramente es útil. Pero si es necesario, no hay alternativas que conozca. En realidad, en lugar de la línea, también se puede usar una macro que debe dar como resultado cualquiera de las dos formas anteriores. Usando la biblioteca de preprocesador boost, puede incrementar la línea actual en 50:
Pensé que es útil mencionarlo ya que preguntaste sobre el uso de
__LINE__y__FILE__. Nunca se obtienen suficientes sorpresas de C ++ :)Editar: @Jonathan Leffler proporciona algunos casos de uso más buenos en los comentarios:
fuente
FYI: g ++ ofrece la macro no estándar __PRETTY_FUNCTION__. Hasta ahora no sabía sobre C99 __func__ (¡gracias Evan!). Creo que todavía prefiero __PRETTY_FUNCTION__ cuando está disponible para el alcance adicional de la clase.
PD:
fuente
Personalmente, soy reacio a usarlos para cualquier cosa que no sea depurar mensajes. Lo he hecho, pero trato de no mostrar ese tipo de información a los clientes o usuarios finales. Mis clientes no son ingenieros y, a veces, no son expertos en informática. Podría registrar esta información en la consola, pero, como dije, de mala gana, excepto para las versiones de depuración o para las herramientas internas. Sin embargo, supongo que depende de la base de clientes que tenga.
fuente
C ++ 20
std::source_locationC ++ finalmente ha agregado una opción no macro, y probablemente dominará en algún momento en el futuro cuando C ++ 20 se generalice:
La documentación dice:
donde NTBS significa "Cadena de bytes terminada nula".
Lo intentaré cuando llegue el soporte a GCC, GCC 9.1.0 con
g++-9 -std=c++2atodavía no lo admite.https://en.cppreference.com/w/cpp/utility/source_location el uso de reclamos será como:
Salida posible:
__PRETTY_FUNCTION__vs__FUNCTION__vs__func__vsstd::source_location::function_nameRespondido a: ¿Cuál es la diferencia entre __PRETTY_FUNCTION__, __FUNCTION__, __func__?
fuente
<experimental/source_location>en gcc-9 actual.Los utilizo todo el tiempo. Lo único que me preocupa es regalar IP en los archivos de registro. Si los nombres de sus funciones son realmente buenos, podría estar haciendo que un secreto comercial sea más fácil de descubrir. Es algo así como enviar con símbolos de depuración, solo que es más difícil encontrar cosas. En el 99.999% de los casos no saldrá nada malo.
fuente
stringsutilidad para extraer todos los datos en forma de cadena del ejecutable. Incluso los ejecutables comprimidos se pueden extraer. Sea muy consciente de lo que envía al sitio de un cliente. Muchas veces, los competidores pueden obtener sus ejecutables, aunque no se supone que lo hagan.