raphson - metodos numericos c++ codigo
Enteros de ancho fijo en C++ (6)
¿El próximo estándar de C ++ definirá enteros de ancho fijo?
Sí.
Como dijo Mehrdad, puedes usar #ifdefs
por ahora. Una alternativa sería una plantilla elaborada de magia. Boost tiene algo en esta dirección, la biblioteca Boost Integer .
Ocasionalmente necesito usar enteros de ancho fijo para la comunicación con dispositivos externos como PLCs. También los uso para definir máscaras de bits y realizar la manipulación de bits de los datos de imagen. AFAIK el estándar C99 define enteros de ancho fijo como int16_t. Sin embargo, el compilador que utilizo, VC ++ 2008 no es compatible con C99 y AFAIK Microsoft no planea admitirlo.
Mi pregunta es ¿cuál es la mejor práctica para usar enteros de ancho fijo en C ++?
Sé que VC ++ define enteros de ancho fijo no estándar como __int16, pero no me atrevo a usar un tipo no estándar. ¿El próximo estándar de C ++ definirá enteros de ancho fijo?
Boost tiene los typedefs para todos los tipos de C99 y más: "Boost integer library"
Hay diferentes caminos a seguir. La mayoría de los entornos sostendrían que short int
. short int
son de 16 bits, y long int
son 32. (el long
está implícito cuando se declara simplemente int
).
Otra posibilidad reside en los campos de bits en las estructuras. Puedes decir algo como:
struct x {
int a : 16;
int b : 5;
...
};
Etcétera. Si entonces define:
struct x myvar;
myvar.a = 54;
Puede estar seguro de que myvar.a tendrá 16 bits, y myvar.b usará 5; el tamaño total de myvar se redondea para lo que comprenden todos los bits, y, por supuesto, el tamaño de cualquier otro campo.
He utilizado una versión de dominio público (no GPL - verdadero dominio público) de stdint.h
por Danny Smith que está disponible en el paquete mingw:
Tuve que modificar esa versión para compilar con algunos compiladores que no sean de VC 8 (en su mayoría VC6); me ha servido bien.
Tal vez uno de estos días pueda publicar mi versión compatible con VC6 en algún lugar. Los cambios fueron bastante menores: solo algunos trucos de macro para usar palabras clave específicas de VC6 para tipos de 64 bits. Si no necesita soporte de VC6, la versión mingw probablemente debería ser todo lo que necesita.
Incluya el archivo <stdint.h>
para obtener las definiciones de tipos como uint16_t
. VC ++ no viene con <stdint.h>
por defecto, pero puede obtener ese archivo desde varios lugares. Wikipedia enumera algunas, y Google te encontrará mucho más.
Puede solucionar el problema con algunas directivas #ifdef
.
#ifdef _MSC_VER
typedef __int16 int16_t
#else
#include <stdint.h>
#endif