¿Agregar mensajes personalizados en assert?


¿Hay alguna manera de agregar o editar el mensaje lanzado por assert? Me gustaría usar algo como

assert(a == b, "A must be equal to B");

Luego, el compilador agrega la línea , tiempo y así sucesivamente...

Es posible?

 91
Author: vines, 2010-09-12

8 answers

Un truco que he visto es usar el operador &&. Dado que un puntero "es verdadero" si no es nulo, puede hacer lo siguiente sin alterar la condición:

assert(a == b && "A is not equal to B");

Dado que assert muestra la condición que falló, también mostrará su mensaje. Si no es suficiente, puede escribir su propia función o macro myAssert que mostrará lo que quiera.

 181
Author: zneak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-11 22:41:34

Otra opción es invertir los operandos y usar el operador coma. Necesita paréntesis adicionales para que la coma no se trate como un delimitador entre los argumentos:

assert(("A must be equal to B", a == b));

(esto fue copiado de los comentarios anteriores, para una mejor visibilidad)

 27
Author: Andrei Bozantan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 22:46:57
BOOST_ASSERT_MSG(expre, msg)

Http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

Puedes usar eso directamente o copiar el código de Boost. También tenga en cuenta que Boost Assert es solo encabezado, por lo que solo podría tomar ese archivo único si no desea instalar todo Boost.

 17
Author: Zero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 03:03:43

Aquí está mi versión de assert macro, que acepta el mensaje e imprime todo de una manera clara:

#include <iostream>

#ifndef NDEBUG
#   define M_Assert(Expr, Msg) \
    __M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
#   define M_Assert(Expr, Msg) ;
#endif

void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
    if (!expr)
    {
        std::cerr << "Assert failed:\t" << msg << "\n"
            << "Expected:\t" << expr_str << "\n"
            << "Source:\t\t" << file << ", line " << line << "\n";
        abort();
    }
}

Ahora, puedes usar esto

M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");

Y en caso de fallo recibirá un mensaje como este:

Assert failed: myFunction: requiere argumento no nulo

Esperado: ptr != nullptr

Fuente: C:\MyProject\src.cpp, línea 22

Agradable y limpio, siéntase libre de usarlo en su código=)

 14
Author: Eugene Magdalits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-19 09:32:38

Como la respuesta de zneak enrolla un poco el código, un mejor enfoque es simplemente comentar el texto de la cadena del que estás hablando. IE.:

assert(a == b); // A must be equal to B

Dado que el lector del error assert buscará el archivo y la línea de todos modos desde el mensaje de error, verá la explicación completa aquí.

Porque, al final del día, esto:

assert(number_of_frames != 0); // Has frames to update

Lee mejor que esto:

assert(number_of_frames != 0 && "Has frames to update");

En términos de análisis humano de código ie. legibilidad. Tampoco es un truco de lenguaje.

 7
Author: metamorphosis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 00:20:31

Assert es una combinación de macro/función. usted puede definir su propia macro/función, utilizando __FILE__, __BASE_FILE__, __LINE__ etc, con su propia función que toma un mensaje personalizado

 1
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-11 22:41:41

¿Por qué nadie mencionó la solución más limpia?

bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);
 0
Author: Piotr Aleksander Chmielowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-04 10:42:06

Para vc, agregue el siguiente código en assert.h,

#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )
 -5
Author: Jichao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-22 10:52:15