2010-09-07 8 views
5

Al revisar la base de código de Visual C++, encontré una cosa extraña. Una aserción de tiempo de ejecución (que es compruebe el estado y lanzar una excepción si la condición es violada) fue utilizado en un caso cuando la condición se pudo evaluar en tiempo de compilación:¿Alguna razón para usar un assert en tiempo de ejecución en lugar de assert en tiempo de compilación?

assert(sizeof(SomeType) == sizeof(SomeOtherType)); 

claramente el compilador evaluará la condición y vuelva a colocar el código que será efectiva ya sea

assert(true); 

que no hace nada o

assert(false); 

que arroja una excepción cada vez que el control pasa por esa línea.

OMI una aserción de tiempo de compilación debería haber ser utilizado en lugar por las siguientes razones:

  • se expondría a la violación condición anterior - en tiempo de compilación - y
  • dejaría limpio (por lo tanto más rápido y más pequeño) código de máquina emitido

Parece que una afirmación en tiempo de compilación es lo único correcto. ¿Hay alguna razón posible para preferir una afirmación en tiempo de ejecución aquí?

+3

Parece una WTF para mí. – egrunin

+0

'assert' por lo general no lanza una excepción, sino que aborta el programa. –

+0

Hasta el momento, no existe una declaración estándar en tiempo de compilación. Ese hecho es bastante importante, especialmente en bases de código antiguas. –

Respuesta

15

No hay ninguna razón para preferir una afirmación en tiempo de ejecución aquí. Debería preferir los errores de tiempo de compilación sobre los errores de tiempo de ejecución, por lo que nunca hay una razón, dada la opción entre los dos, para elegir una afirmación en tiempo de ejecución.

Sin embargo, si una afirmación estática no es una opción (no conoce el concepto de una afirmación estática, no sabe cómo hacer una y no tiene una disponible, o sabe cómo hacer una pero no tiene tiempo para hacerlo), una afirmación en tiempo de ejecución es la siguiente mejor opción.

Con C++ 0x, la función incorporada static_assert debe terminar con todos los motivos para usar una afirmación en tiempo de ejecución donde funcionaría una afirmación en tiempo de compilación.

4

No podemos decir sin contexto. En el código de plantilla, algunas ramas podrían no estar disponibles para algunas instancias. Una afirmación en tiempo de compilación sería inapropiada, ya que eso hace que toda la función se deforme. Un assert(<type-dependent expression>) no lo hace.

E.g.

template <typename T> void foo(T t) 
{ 
    if (t < 0) { 
    assert(std::numeric_limits<T>::min() < 0); 
    T u = t - std::numeric_limits<T>::min(); 
    } 
} 

la aserción no se puede convertir en una aserción estática, a pesar de que la aserción de tiempo de ejecución nunca falla.

+0

¿Por qué no se puede hacer un 'static_assert'? – GManNickG

+0

'assert (std :: numeric_limits :: min <0);' siempre falla, independientemente de T. – usta

+0

@usta: ¿está comentando sobre la falta de una llamada de función? @MSalters: Creo que quería 'min()' –

Cuestiones relacionadas