¿Hay algún #define estandarizado (por ejemplo, implementado por todos los compiladores) que me permita distinguir entre compilaciones de depuración y lanzamiento?C/C++: ¿forma portátil de detectar errores/versiones?
Respuesta
si creen
#ifdef NDEBUG
// nondebug
#else
// debug code
#endif
es el más portátil.
Pero no El compilador sabe si está compilando depurar o liberar, por lo que esto no es automático. Pero este es utilizado por assert.h en el c-runtime, por lo que es bastante común. Visual Studio lo configurará, y estoy seguro de que la mayoría de los otros IDE también lo harán.
la falta de un _ en el frente indica que probablemente se menciona en los estándares C o C++ en alguna parte. MS ha sido muy cuidadoso en los últimos lanzamientos para prefijar cualquier macro o función no estándar en sus archivos de cabecera de c-runtime con '_ –
Eso no es lo mismo. La definición de NDEBUG desactiva las macros assert. Nada más. Esto hace __NOT__ implica depuración. –
@Martin: nondebug en realidad. y si solo se pretendía apagar las macros assert, lo habrían llamado NOASSERT. deberías leer lo que escribí antes de comenzar a sacar puntos. –
Edit: ¡He leído mal la pregunta y me he salido en una tangente diferente! Disculpas ... La macro _NDEBUG se usa tanto en Linux como en Windows ...
Si se genera el binario y debe determinar si la compilación fue de lanzamiento/depuración, puede obtener un volcado hexadecimal, si verá muchos símbolos en él que serían información de depuración ... por ejemplo, bajo Linux, usando la utilidad strings. Hay una versión disponible para Windows por SysInternals, disponible aquí en technet. versiones de lanzamiento de ejecutables binarios no tendrían las cadenas que representan diferentes símbolos ...
strings some_binary
Espero que esto ayude, Saludos, Tom.
No necesariamente cierto; es posible producir binarios con símbolos (es decir, para funciones y datos estáticos) pero no depurar información (es decir, números de línea). –
Dicho esto, las banderas que proporcionan esa información generalmente se almacenan en el encabezado del formato de archivo de objeto. Prueba GNU objdump (también hay una versión para Windows, distribuida con MinGW): objdump -x –
Como no hay una definición estándar de depuración o liberación, no hay una forma de hacerlo. Puedo pensar en al menos cuatro cosas diferentes que podrían significar, y todas pueden cambiarse de forma independiente. Solo dos pueden ser probados desde dentro del código.
- nivel de optimización del compilador
- símbolos de depuración incluidas en binario (que incluso pueden ser eliminados en una fecha posterior)
- assert() habilitada (NDEBUG no definida)
- registro de apagado
- 1. Detalles de call/cc
- 2. ¿Cómo detectar cuando la computadora portátil funciona con baterías?
- 3. Rieles: creación de archivos temporales de forma portátil
- 4. ¿Qué es call/cc?
- 5. PHP Mail, CC Field
- 6. forma portátil de "tenedor()" en la aplicación Qt4?
- 7. Proceso de horquillas con CC .NET
- 8. patrones "call-cc" en Scala?
- 9. La forma de detectar el raspado web
- 10. Detectar Windows de forma segura en Python
- 11. Erlang portátil
- 12. mountainlion abril compilar carente de 'CC'
- 13. Paquete portátil WAMP?
- 14. Control de versión portátil?
- 15. Fin de línea portátil
- 16. ¿Cómo detectar cuando el cable de alimentación de la computadora portátil se ha desconectado?
- 17. ¿Podemos detectar el nivel de batería de la computadora portátil con .net?
- 18. ¿Cómo cambian DP y CC en Piet?
- 19. Detectar el cierre y la apertura de la tapa del portátil
- 20. uintptr_t alternativa portátil
- 21. Diferencia entre CC, gcc y g ++?
- 22. Cómo hacer que CC-Tray funcione
- 23. Continuación (call/cc) en el Esquema
- 24. ¿Qué significa CC? = En un Makefile?
- 25. Indicaciones de predicción de bifurcación portátil
- 26. En makefiles, ¿qué significan CC y LD?
- 27. Detectar si la aplicación se está ejecutando en la computadora portátil
- 28. base de datos portátil gratuito
- 29. compilador independiente de C# portátil
- 30. ¿Cuáles son los códigos tales como CC, LD y CC [M] de salida al compilar el kernel de Linux?
En realidad, el proyecto principal en el que trabajo, seguimos depurando en nuestro lanzamiento, pero que determine la verbosidad en el tiempo de ejecución. Ha demostrado ser útil en la búsqueda de errores en la naturaleza, con un costo mínimo (muy difícil de notar, sin quejas del usuario) cuando no está habilitado. Fuera de los entornos integrados, consideraría este enfoque. – mctylr
¿Qué es una "versión de lanzamiento"? El estándar de C++ no lo define, por lo que no hay una forma portátil de detectar si algo es una versión de lanzamiento. – jalf