2011-08-11 13 views
5

Estaba leyendo sobre hacer que el código sea más portátil usando enteros de ancho fijo. He encontrado this artículo que ayudó a explicar las cosas, y al final se sugiere el uso de esta unión anónima para detectar y reportar errores: typedefDetecta e informa errores tipodef ... ¿Qué está haciendo esto?

static union 
{ 
    char int8_t_incorrect[sizeof( int8_t) == 1]; 
    char uint8_t_incorrect[sizeof(uint8_t) == 1]; 
    char int16_t_incorrect[sizeof(int16_t) == 2]; 
    char uint16_t_incorrect[sizeof(uint16_t) == 2]; 
    char int32_t_incorrect[sizeof(int32_t) == 4]; 
    char uint32_t_incorrect[sizeof(uint32_t) == 4]; 
}; 

estoy un poco perdido y yo estaba esperando que alguien podría explicar por qué esto está haciendo ?

Respuesta

4

Está abusando del compilador, eso es lo que está haciendo.

Básicamente, el sizeof(type) == num está siendo evaluado en tiempo de compilación, y va a producir un 0 o un 1 (falso o verdadero). Si es 0 (que ninguno de ellos debería ser), produce un error de compilación, ya que no puede declarar una matriz de tamaño cero.

Pero como se mencionó, esto es bastante abusivo con el compilador, y la mayoría de los entornos de construcción sónicos garantizarían que los typedefs sean correctos para usted (autoconf por ejemplo tiene macros incorporados para este tipo de cosas).

+0

Incluso los compiladores incrustados son un poco más inteligentes de lo que eran cuando se escribió el artículo, en 2004. –

+0

Oh veo, muchas gracias por la explicación ... parece simple ahora – Morgan

+1

No veo cómo esto es "abuso" . Sin sentido, tal vez. –

4

Si alguna de estas comprobaciones de igualdad resulta en falso, esa unión tendrá un campo con un tamaño de matriz de 0, lo que no está permitido y dará como resultado un error de compilación.

+0

Gracias, su respuesta y la segunda ayudó a aclararlo para mí. – Morgan

Cuestiones relacionadas