La intención original en C ++ 98 era que se usara <cstdint>
en C ++, para evitar contaminar el espacio de nombres global (bueno, no <cstdint>
en particular, eso solo se agrega en C ++ 11, pero los <c*>
encabezados en general).
Sin embargo, las implementaciones persistieron en poner 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:
- Use
<cstdint>
y califique completamente cada tipo de entero que use o bien, llévelo al alcance con using std::int32_t;
etc. (molesto porque es detallado, pero es la forma correcta de hacerlo como para cualquier otro símbolo en la biblioteca estándar de C ++)
- Uso
<stdint.h>
(levemente malo porque obsoleto)
- Use
<cstdint>
y asuma que su implementación colocará los símbolos en el espacio de nombres global (muy mal porque no está garantizado).
En la práctica, sospecho que una gran cantidad de código molesta usa la última opción, simplemente porque es fácil de hacer por accidente en una implementación donde se <cstdint>
colocan los símbolos en el espacio de nombres global. Deberías intentar usar el primero. La segunda tiene una virtud, que está garantizado poner cosas en el espacio de nombres global en lugar de solo hacerlo tal vez. No creo que eso sea particularmente útil, pero podría ahorrar algo de escritura si esa es su prioridad.
Hay una cuarta opción, #include <cstdint>
seguida de la using namespace std;
que a veces es útil, pero hay lugares en los que no debes poner el using namespace std;
. Diferentes personas tendrán diferentes ideas sobre dónde están 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 alcance limitado". Algunas personas nunca escriben using namespace std;
en absoluto.
[*] Eso significa que los encabezados estándar de C ++ pueden poner cosas en el espacio de nombres global, pero no es obligatorio. Por lo tanto, debe evitar chocar con esos símbolos, pero en realidad no puede usarlos porque es posible que no estén allí. Básicamente, el espacio de nombres global en C ++ es un campo minado, trate de evitarlo. Se podría argumentar que el comité ha ratificado una práctica mediante 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 para símbolos en la biblioteca estándar de C, mientras using namespace std;
que lo hace para C ++ -sólo símbolos también. Hay una sección en el estándar C que enumera los nombres reservados para futuras adiciones al estándar. No es una idea completamente estúpida tratar esos nombres como reservados en el espacio de nombres global de C ++ también, pero no es esencial.
<cstdint>
. Aquí está el error que recibo:./misc.h:7:10: fatal error: 'cstdint' file not found
.