uint8_t uint32_t sirve que para c++ stdint cstdint

c++ - uint32_t - <cstdint> vs<stdint.h>



uint32_t que es (3)

  1. cstdint es el cstdint C ++ 11, stdint.h es el encabezado C99 (C y C ++ son idiomas diferentes!)

  2. MSVC 2008 no contiene ni stdint.h ni cstdint .

  3. Las implementaciones de cstdint son, en su mayoría, simplemente #include <stdint.h> con algunas correcciones de espacios de nombres / idiomas.

¿Cuál es la diferencia entre stdint.h y cstdint ?

Ambos están disponibles en MSVC (Visual Studio 2010) y gcc-4.5.1. También ambos definen los tipos intX_t / uintX_t (donde X es el tamaño en bytes del tipo).

  • Si el razonamiento en ambos encabezados es el mismo (tipos portátiles), ¿qué decisiones debo tomar para decidir sobre una u otra?

stdint.h define cada tipo sin ningún espacio de nombres, los tipos de cstdint encuentran en el std nombres cstdint .

  • ¿Hay alguna razón para incluir o no incluir los tipos definidos en el std nombres std ? ¿Qué es diferente entre los dos encabezados?

cstdint no tiene extensión de archivo y usa el prefijo c , stdint.h usa la extensión .h .

  • ¿Cuáles son las convenciones de nombres para estos encabezados? el prefijo c indica que esta es una biblioteca C hay una razón para la falta de extensión de archivo en cstdint ?

Incluir cstdint importa los nombres de los símbolos en el espacio de nombres std y posiblemente en el espacio de nombres Global.
La inclusión de stdint.h importa los nombres de los símbolos en el espacio de nombres Global y posiblemente en el espacio de nombres std.

Las características de la biblioteca estándar C también se proporcionan en la biblioteca estándar de C ++ y, como convención de nomenclatura general, son pre-agregadas por una c a los nombres correspondientes en la biblioteca estándar C.

En C ++, debe usar:

#include <cstdint>

y califica completamente los nombres de símbolos que usas con std::
mientras estés en C, debes usar:

#include <stdint.h>

Anexo D (normativo) Características de compatibilidad [depr] :

D.6 C cabeceras de biblioteca estándar

1 Para la compatibilidad con la biblioteca estándar C y el C Unicode TR, la biblioteca estándar C ++ proporciona los encabezados 25 C, como se muestra en la Tabla 151.

Que incluye:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

Y además,

2 Cada encabezado C, cada uno de los cuales tiene un nombre del nombre del formulario.h, se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el cname header correspondiente se ubica dentro del alcance del espacio de nombres global. No se especifica si estos nombres se declaran o definen por primera vez dentro del ámbito de espacio de nombres (3.3.6) del espacio de nombres estándar y luego se inyectan en el ámbito del espacio de nombres global mediante declaraciones de uso explícitas (7.3.3).

3 [Ejemplo: el encabezado <cstdlib> seguridad proporciona sus declaraciones y definiciones dentro del espacio de nombres std. También puede proporcionar estos nombres dentro del espacio de nombres global. El encabezado <stdlib.h> seguridad proporciona las mismas declaraciones y definiciones dentro del espacio de nombres global, de forma muy similar al estándar C. También puede proporcionar estos nombres dentro del espacio de nombres std. -Final ejemplo]


La intención original en C ++ 98 era que usted debería usar <cstdint> en C ++, para evitar contaminar el espacio de nombres global (bueno, no <cstdint> en particular, eso solo se agrega en C ++ 11, pero el <c*> encabezados en general).

Sin embargo, las implementaciones persistieron al colocar los símbolos en el espacio de nombres global de todos modos, y C ++ 11 ratificó esta práctica [*]. Entonces, básicamente tienes tres opciones:

  • Utilice <cstdint> y califique completamente cada tipo de entero que utilice o bien using std::int32_t; dentro del alcance con using std::int32_t; etc. (molesto porque detallado, pero es la manera correcta de hacerlo como cualquier otro símbolo en la biblioteca estándar de C ++)
  • Use <stdint.h> (levemente malo porque está en desuso)
  • Use <cstdint> y suponga que su implementación colocará los símbolos en el espacio de nombres global (muy malo porque no está garantizado).

En la práctica, sospecho que una gran cantidad molesta de código usa la última opción, simplemente porque es fácil de hacer por accidente en una implementación donde <cstdint> coloca los símbolos en el espacio de nombres global. Deberías tratar de usar el primero. El segundo tiene una virtud, que está garantizado poner cosas en el espacio de nombres global en lugar de solo hacerlo. No creo que sea particularmente útil, pero podría ahorrar algo de tipeo si esa es su prioridad.

Hay una cuarta opción, #include <cstdint> seguido por el using namespace std; que a veces es útil, pero hay lugares en los que no debe colocar el using namespace std; . Diferentes personas tendrán diferentes ideas en esos lugares, pero "en el nivel superior en un archivo de encabezado" es peor que "en el nivel superior en un archivo cpp", que es peor que "en un ámbito limitado". Algunas personas nunca escriben using namespace std; en absoluto.

[*] Eso significa que los encabezados estándar de C ++ pueden colocar cosas en el espacio de nombres global pero no son obligatorios. Entonces debes evitar colisionar con esos símbolos, pero no puedes usarlos porque podrían no estar allí. Básicamente, el espacio de nombres global en C ++ es un campo de minas, trata de evitarlo. Se podría argumentar que el comité ha ratificado una práctica por implementaciones que es casi tan dañina como quedarse using namespace std; en el nivel superior en un archivo de encabezado; la diferencia es que las implementaciones solo lo hacen por símbolos en la biblioteca estándar C, mientras que using namespace std; lo hace también para C ++ - solo símbolos. Hay una sección en el estándar C que enumera los nombres reservados para futuras adiciones al estándar. No es una idea estúpida tratar esos nombres como reservados en el espacio de nombres global de C ++, pero no es esencial.