2010-04-06 10 views
14

Duplicar posibles:
Why can’t I use sizeof in a preprocessor condition ?Comprobación de la sizeof un tipo entero en el preprocesador

¿Cómo puedo comprobar el tamaño de un unsigned en el preprocesador bajo g ++? sizeof está fuera de la cuestión ya que no está definido cuando durante el preprocesamiento.

+0

No está bien respondido allí. – myahya

+2

@Lucero: Eso solo responde por qué sizeof está fuera de la cuestión que myahya conoce. – UncleBens

+0

Quizás http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c cubra su pregunta? –

Respuesta

25

Puede que este no sea el método más elegante, pero una cosa que puede aprovechar es UINT_MAX definido en "limits.h". Es decir, ...

si UINT_MAX == 65535, entonces sabría que sizeof (sin firmar) = 2

si UINT_MAX == 4294967295, entonces sabría que sizeof (sin firmar) = 4.

y así sucesivamente.

Como dije, no es elegante, pero debería proporcionar cierto nivel de usabilidad.

Espero que esto ayude.

+1

Esta es una respuesta válida que no está en la pregunta "duplicado". Entonces, he votado para reabrir. –

+1

El preprocesador debería poder hacer algunas operaciones matemáticas, algo como '#if UINT_MAX >> 8 == 0 // 1 byte' ...' #elif UINT_MAX >> 16 == 0 // dos bytes', etc. – UncleBens

+3

Técnicamente, el tamaño del número entero podría ser mayor de lo que predice esta técnica, ya que 'unsigned' puede tener bits de relleno, o menor, ya que CHAR_BIT no necesita ser 8. Entonces, para ser correctos también vale la pena afirmar en algún lugar (en una prueba, quizás), que 'sizeof' da el tamaño esperado. En la práctica, puedes decir con confianza que no va a suceder. –

9

Sobre la base de la respuesta de Sparky, aquí es una forma que se vería un poco más agradable (mediante la eliminación de los números explícitos)

#include <limits.h> 
#include <stdint.h> 

//Check if size if 4bytes 
#if UINT_MAX == UINT32_MAX 

.... 

#endif 

<limits.h> define INT_MAX y <stdint.h> define UINT32_MAX. Generalmente, <stdint.h> proporciona tipos enteros con anchuras especificadas.

+0

Esto funciona bajo gcc, bajo g ++ puede ser problemático. La solución de Sparky es más general – myahya

Cuestiones relacionadas