Pregunta

A diferencia de Java o C #, tipos de datos primitivos en C ++ puede variar en tamaño dependiendo de la plataforma. Por ejemplo, int no se garantiza que sea un número entero de 32 bits. Varios entornos compilador definen los tipos de datos tales como uint32 o dword para este propósito, pero parece que hay ninguna norma archivo de inclusión para tipos de datos de tamaño fijo.

¿Cuál es el método recomendado para lograr la máxima portabilidad?

¿Fue útil?

Solución

he encontrado esta cabecera particularmente útil: BOOST cstdint

Por lo general, mejor que inventar propia rueda (que incurre el mantenimiento y pruebas).

Otros consejos

Crear un archivo de cabecera llamada types.h, y definir todos los tipos primitivos de tamaño fijo que necesita (int32, uint32, uint8, etc.). Para dar soporte a múltiples plataformas, puede uso de #ifdef o tener una separada incluyen directorio para cada plataforma (include_x86, include_x86_64, include_sparc). En este último caso, tendría configuraciones de construcción separados para cada plataforma, lo que tendría el derecho de incluir en su directorio de ruta de inclusión. El segundo método es preferible, de acuerdo con los "C ++ Gotchas" por Stephen Dewhurst.

Sólo un lado, si usted está planeando para pasar datos binarios entre diferentes plataformas, también tiene que preocuparse de orden de bytes.

Parte de la norma C99 era un archivo de cabecera stdint.h para proporcionar este tipo de información. Por ejemplo, se define un tipo llamado uint32_t. Por desgracia, muchos de los compiladores no son compatibles con stdint.h. La mejor aplicación multiplataforma que he visto de stdint.h está aquí: http: // www. azillionmonkeys.com/qed/pstdint.h . Que sólo puede incluir eso en su proyecto.

Si está utilizando impulso, creo que también ofrece algo equivalente a la cabecera stdint.

Definir un tipo (por ejemplo int32) en un archivo de cabecera. Para cada plataforma de utilizar otro #ifdef y asegúrese de que IN32 es un entero de 32 bits. Por todas partes en el uso de código int32 y asegúrese de que cuando se compila en diferentes plataformas se utiliza el derecho de definir

Dos cosas:

En primer lugar, hay una llamada limits.h archivo de cabecera que le da un montón de plataforma útil Información específica. Se dará a los valores máximo y mínimo para el tipo int por ejemplo. A partir de eso, se puede deducir cuán grande es el tipo int es.

También puede utilizar el operador sizeof en tiempo de ejecución para estos propósitos también.

Espero que esto ayude. . .

K

Si su nombre comienza con dos subrayados (__), un tipo de datos no es estándar.

__ int8 (__int8 sin signo)

__ Int16 (__int16 sin signo)

__ int32 (__int32 sin signo)

__ Int64 (__int64 sin signo)

Trate de usar realce / cstdint.hpp

Hay una cabecera stdint.h definido por el estándar C99 y (creo) alguna variante u otra de ISO C ++. Esto define como buenos tipos int16_t, uint64_t, etc ... que están garantizados para tener un tamaño y una representación específica. Por desgracia, su disponibilidad no es exactamente estándar (Microsoft en particular, era un dragger pie aquí).

La respuesta simple es este, que funciona en cada arquitectura de byte-direccionable 32 o 64 bits Soy consciente de:

  • Todas las variables de carbonilla son 1 byte
  • Todas las variables son cortos 2 bytes
  • Todas las variables int son 4 bytes
  • No utilice el "largo", que es de un tamaño indeterminado.
  • Todos los compiladores conocidos con el apoyo de matemáticas de 64 bits permiten "long long" como un tipo nativo de 64 bits.

Tenga en cuenta que algunos compiladores de 32 bits no tienen un tipo de 64 bits en absoluto, por lo que el uso a largo tiempo va a limitar a los sistemas de 64 bits y un conjunto más pequeño de los compiladores (que incluye gcc y MSVC, por lo que la mayoría de la gente ganó' t atención sobre este problema).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top