La aserción estática se usa para hacer aserciones en tiempo de compilación. Cuando la aserción estática falla, el programa simplemente no se compila. Esto es útil en diferentes situaciones, como, por ejemplo, si implementa alguna funcionalidad por código que depende críticamente de que el unsigned int
objeto tenga exactamente 32 bits. Puedes poner una aserción estática como esta
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
en su código. En otra plataforma, con un unsigned int
tipo de letra de tamaño diferente, la compilación fallará, lo que llamará la atención del desarrollador sobre la parte problemática del código y le aconsejará que lo vuelva a implementar o lo vuelva a inspeccionar.
Para otro ejemplo, es posible que desee pasar algún valor integral como un void *
puntero a una función (un truco, pero útil a veces) y desea asegurarse de que el valor integral quepa en el puntero
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Es posible que desee que el activo de ese char
tipo esté firmado
static_assert(CHAR_MIN < 0);
o que la división integral con valores negativos se redondea hacia cero
static_assert(-5 / 2 == -2);
Y así.
En muchos casos, las aserciones en tiempo de ejecución se pueden usar en lugar de las aserciones estáticas, pero las aserciones en tiempo de ejecución solo funcionan en tiempo de ejecución y solo cuando el control pasa sobre la aserción. Por esta razón, una aserción de tiempo de ejecución fallida puede permanecer inactiva, sin ser detectada durante períodos de tiempo prolongados.
Por supuesto, la expresión en aserción estática tiene que ser una constante en tiempo de compilación. No puede ser un valor en tiempo de ejecución. Para los valores de tiempo de ejecución, no tiene otra opción que utilizar el ordinario assert
.