tipos suspicious prevenir polimórfico macro informaticos ejemplos como c++ c gcc compiler-construction macros

c++ - suspicious - ¿Cuál es el propósito de un doble negativo en la definición de macro, como(!!(expr))?



virus fat (4)

En el ejemplo que nos mostraste, el !! es completamente inútil Sin embargo, en general se usa como un equivalente aproximado al C99 para lanzar a _Bool , es decir, 0 permanece 0 y cualquier otro valor se convierte en 1.

Posible duplicado:
Double Negation en código C ++.

Estoy leyendo una base de código y encuentro algo como esto:

#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))

No puedo entender por qué (!! (expr)) se usa en lugar de uno (expr) . De todos modos, un doble negativo significa positivo, ¿no? ¿Me estoy perdiendo de algo?


Es un modismo que a veces se usa en C ++ para convertir a un tipo booleano.


Simplemente se asegurará de que la parte expr de la macro se convierta en bool.


Es una forma de lanzar una expresión a bool. Sin embargo, en C ++, operador! puede estar sobrecargado Otra forma de C / C ++:

0 != (expr)

Solo en C ++:

static_cast<bool>(expr)

[Editar] Pensando más sobre la sobrecarga del operador C ++, tiene sentido evitar el uso de operadores. Las bibliotecas como Boost.Spirit y Boost.Lambda usan plantillas de expresión y evaluación diferida, de modo que expresiones como (expr) || call() (expr) || call() puede comportarse no como se esperaba. La versión más a prueba de balas de esa macro se ve así:

#define uassert(expr) if(expr) {} else { uasserted(...); }

Aquí, solo se usa la conversión de expr a bool. La rama else es necesaria para proteger de expresiones como uassert(x) else something_else(); .