La afirmación estática se utiliza para realizar afirmaciones en tiempo de compilación. Cuando la aserción estática falla, el programa simplemente no compila. Esto es útil en diferentes situaciones, como, por ejemplo, si implementa alguna funcionalidad por código que depende críticamente del objeto unsigned int
que tiene exactamente 32 bits.Puede poner una afirmación estática como esta
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
en su código. En otra plataforma, con el tipo de unsigned int
de diferente tamaño, la compilación fallará, llamando la atención del desarrollador sobre la parte problemática del código y aconsejándoles que lo vuelvan a implementar o vuelvan a inspeccionar.
Para otro ejemplo, es posible que desee pasar algún valor integral como un puntero void *
a una función (un truco, pero útil a veces) y que desea asegurarse de que el valor integral encajará en el puntero
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
es posible que desee activo que char
tipo se firmó
static_assert(CHAR_MIN < 0);
o que la división integral con valores negativos redondea hacia cero
static_assert(-5/2 == -2);
Y así sucesivamente.
Las aserciones en tiempo de ejecución en muchos casos se pueden usar en lugar de aserciones estáticas, pero las aserciones en tiempo de ejecución solo funcionan en tiempo de ejecución y solo cuando el control pasa por encima de la aserción. Por esta razón, una afirmación de tiempo de ejecución anómala puede permanecer latente, no detectada durante largos periodos de tiempo.
Por supuesto, la expresión en la aserción estática debe ser una constante en tiempo de compilación. No puede ser un valor de tiempo de ejecución. Para los valores de tiempo de ejecución, no tiene otra opción que usar el ordinario assert
.
VEA TAMBIÉN: BOOST_MPL_ASSERT, BOOST_MPL_ASSERT_NOT, BOOST_MPL_ASSERT_MSG, BOOST_MPL_ASSERT_RELATION [http://www.boost.org/doc/libs/1_40_0/libs/mpl/doc/refmanual/asserts.html] para más opciones. _MSG es especialmente bueno una vez que descubres cómo usarlo. – KitsuneYMG