De vez en cuando me necesitan para el uso de ancho fijo enteros para la comunicación con dispositivos externos, tales como PLCs. También las uso para definir máscaras y realizar la manipulación de bits de los datos de la imagen. AFAIK el estándar C99 define de ancho fijo enteros como int16_t. Sin embargo, el compilador que uso, VC++ 2008 no admiten la C99 y AFAIK Microsoft no es la planificación de apoyo.

Mi pregunta es ¿cuál es la mejor práctica para el uso de ancho fijo enteros en C++?

Sé que VC++ define como no-estándar ancho fijo enteros como __int16, pero soy reacio a usar un tipo estándar. Será el próximo estándar de C++ definir ancho fijo enteros?

6 Comentarios

  1. 18

    Puede solucionar el problema con algunos #ifdef directivas.

    #ifdef _MSC_VER
       typedef __int16 int16_t
    #else
       #include <stdint.h>
    #endif
    • +1 solución Inteligente, bien hecho!
    • Sólo para tu INFORMACIÓN para los lectores futuros, MSVC 2010 tiene <cstdint>!
  2. 7

    Incluir el archivo <stdint.h> para obtener las definiciones de tipos como uint16_t. VC++ no viene con <stdint.h> por defecto, pero usted puede conseguir ese archivo desde varios lugares. Wikipedia listas de unos pocos, y Google va a encontrar usted mucho más.

    • El problema es que stdint.h, como la mayoría o todos los de C y C++ encabezados, es específica de la implementación. Las definiciones dependen de la implementación. Cualquier aleatoria de cabecera podría funcionar igual de bien, o no.
    • Ese es un buen punto, pero en este caso la stdint.h archivos enumerados en la página de la Wikipedia son, de hecho, escrito específicamente para MSVC++.
    • Ah, entonces no estamos hablando de azar encabezados aquí. Bueno.
  3. 1

    He usado un dominio público (no GPL – cierto dominio público), la versión de stdint.h por Danny Smith que está disponible en el mingw paquete:

    Tuve que modificar esa versión de compilación con algunos de los VC 8 compiladores (en su mayoría VC6) – que me ha servido bien.

    Tal vez uno de estos días voy a poner en torno a la publicación de mi VC6-versión compatible en algún lugar. Los cambios fueron bastante menores – sólo algunos macro artimañas para uso VC6 de palabras clave específicas para 64 bits tipos. Si usted no necesita VC6 apoyo, la versión de mingw debería de ser todo lo que usted necesita.

  4. 0

    Hay diferentes caminos a tomar. La mayoría de los entornos sostendría que short ints son de 16 bits, y long ints son 32. (El long es implícita cuando se declara simplemente int.) Si usted typedef su propia int16 tipo, usted probablemente va a terminar con un short int.

    Otra posibilidad reside con los campos de bits en estructuras. Usted puede decir algo como:

    struct x {
        int a : 16;
        int b : 5;
        ...
    };

    Y así sucesivamente. Si a continuación se define:

    struct x myvar;
    myvar.a = 54;

    Usted puede estar seguro de que myvar.un celebrará de 16 bits, y myvar.b va a utilizar 5; el tamaño total de myvar redondeo por lo que todos los bits que la componen, además de, por supuesto, el tamaño de alguno de los otros campos.

    • corto es generalmente de 16 bits, pero a la larga puede ser de 32 o de 64 bits en sistemas modernos. largo, largo casi siempre va a ser de 64.
    • David del derecho. Si usted va esta ruta, me gustaría incluir, como mínimo, algo así como «assert(sizeof (short) == 2)» en algún lugar en el código.
    • Anhela, en teoría, puede ser de 64 bits. Nunca he trabajado con una máquina de 64 bits, pero mi impresión ha sido que la mayoría de los compiladores todavía mantener largas en 32 y te obligan a usar mucho para 64. Lo difícil es, creo, todo esto es la implementación definido, independientemente de los convenios.

Dejar respuesta

Please enter your comment!
Please enter your name here