¿Se hace caso omiso de assert (false) en el modo de lanzamiento (VC++)?es assert (false) ignorado en modo de lanzamiento (VC++)?
Respuesta
Si compilar en modo de lanzamiento incluye definir NDEBUG, entonces sí.
Ver assert (CRT)
IIRC, assert (x) es una macro que no se evalúa en nada cuando se define NDEBUG, que es el estándar para las compilaciones de Release en Visual Studio.
Solo si se define NDEBUG creo (que será de manera predeterminada para las aplicaciones de Visual C++).
La macro de afirmación (al menos típicamente es una macro) generalmente se define como no operativa en el código de lanzamiento. Solo se activará en el código de depuración. Una vez dicho esto. He trabajado en lugares que definieron su propia macro assert, y se activó tanto en el modo de depuración como en el de liberación.
Me enseñaron a usar afirmaciones para condiciones que "nunca" pueden ser falsas, como las condiciones previas para una función.
Creo que es un error confiar demasiado en el comportamiento exacto de la aserción. La semántica correcta de "assert (expr)" es:
- La expresión expr puede o no evaluarse.
- Si expr es verdadero, la ejecución continúa normalmente.
- Si expr es falso, lo que sucede no está definido.
Más contenido en http://nedbatchelder.com/text/assert.html
La semántica correcta se describe en ISO C. Si las aserciones están habilitadas ('NDEBUG' no está definido antes de incluir'
misma para GNU:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
- 1. ¿Debug.Assert genera IL en modo de lanzamiento?
- 2. Trace.WriteLine en modo de lanzamiento?
- 3. Símbolos de depuración en modo de lanzamiento
- 4. Cómo poner assert en compilaciones de lanzamiento en C/C++
- 5. bucle infinito en modo de lanzamiento
- 6. Depuración en .NET en modo de lanzamiento
- 7. ¿Cómo depurar en modo de lanzamiento?
- 8. Escribir para depurar en modo de lanzamiento
- 9. Debug.Assert aparece en el modo de lanzamiento
- 10. problemas con Console.SetOut en modo de lanzamiento?
- 11. ¿Por qué mi aplicación falla en modo de lanzamiento pero no en modo de depuración?
- 12. Embalaje de proyectos NuGet compilados en modo de lanzamiento?
- 13. C++ Xcode assert evaluado en la versión
- 14. ¿Cómo construir en modo de lanzamiento con optimizaciones en GCC?
- 15. ¿Implementar la aplicación en producción usando el modo de depuración en lugar del modo de lanzamiento?
- 16. ¿Puede el operador C# 'es' sufrir en optimización de modo de lanzamiento en .NET 4?
- 17. ¿Cómo habilitar la macro TRACE en el modo de lanzamiento?
- 18. ASSERT vs. ATLASSERT vs. assert
- 19. ¿Cuáles son las ventajas o la diferencia en "assert False" y "self.assertFalse"
- 20. ¿Cuál es la diferencia entre el modo de depuración y el modo de lanzamiento en Visual Studio 2010?
- 21. maxItemsInObjectGraph ignorado
- 22. ValidateRequest = False pero en acción sigue siendo True e ignorado eso?
- 23. Distinguir el modo de desarrollo y la configuración del entorno del modo de lanzamiento en Android
- 24. programación detección de modo de lanzamiento/depuración (NET)
- 25. ¿Debería ser "Arrange-Assert-Act-Assert"?
- 26. Release Mode vs Debug = "false"
- 27. C++ define un modo de lanzamiento 'mejor' incorporar VS
- 28. modo de lanzamiento mucho más grande que la versión modo de depuración
- 29. JavaScript: {} == false es un SyntaxError?
- 30. es igual a devolver false
Las documentaciones afirma "La rutina aserción está disponible tanto en las versiones de lanzamiento y de depuración de las bibliotecas de C en tiempo de ejecución." Sin embargo, mirando el encabezado assert.h, es cierto que definir NDEBUG antes de incluirlo hará que assert() compile a un no-op. Sin embargo, es totalmente posible que el código del modo de lanzamiento no defina NDEBUG para hacer abortar una aserción. Solo quería aclarar mi propio entendimiento y compartir lo que encontré. –