me encontré con esta definición de preprocesador al leer el código fuente en Windows Research Kernel (WRK) 1.2:¿Qué significa "#define assert (exp) ((void) 0)" do?
#define assert(exp) ((void) 0)
¿Qué hace este código? ¿Por qué está definido?
me encontré con esta definición de preprocesador al leer el código fuente en Windows Research Kernel (WRK) 1.2:¿Qué significa "#define assert (exp) ((void) 0)" do?
#define assert(exp) ((void) 0)
¿Qué hace este código? ¿Por qué está definido?
Define la expresión assert (cualquier cosa) para no hacer nada.
Presumiblemente, el entorno que se utiliza no es compatible con la declaración ANSI C assert, o el programador no tenía conocimiento de que se podría desactivar definiendo NDEBUG.
O el código estaba en assert.h –
Para ampliar lo bdonlan dice, la razón por la macro no se expande vacía es porque si lo hiciera, entonces algo así como:
assert(something) // oops, missed the semi-colon
assert(another_thing);
compile en modo de lanzamiento, pero no en el modo de depuración. La razón por la cual es ((void) 0)
en vez de solo 0
es para evitar advertencias de "declaración sin efecto" (o lo que MSVC las llame).
Sólo para añadir, esta es la definición de afirman en newlib también, cuando NDEBUG
se define como una directiva de preprocesador. Newlib es la biblioteca C de código abierto que se utiliza en Cygwin y sistemas integrados.
Desde el manual deaserción en newlib:
La macro se define para permitir que para desactivar todos los usos de afirman en tiempo de compilación definiendo
NDEBUG
como una variable de preprocesador. Si hace esto, el afirman macro se expande a(void(0))
Sólo por curiosidad - ¿cuál es WRK 1.2? –
Mi suposición: Windows Research Kernel 1.2 –
Sí, es Windows Research Kernel 1.2 – Porco