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_location
C ++ 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++2a
todaví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_name
Respondido 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
strings
utilidad 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.