A intenção original em C ++ 98 era que você deveria usar <cstdint>
em C ++, para evitar poluir o namespace global (bem, não <cstdint>
em particular, isso só é adicionado em C ++ 11, mas os <c*>
cabeçalhos em geral).
No entanto, as implementações persistiram em colocar os símbolos no namespace global de qualquer maneira, e o C ++ 11 ratificou essa prática [*]. Então, você tem basicamente três opções:
- Use
<cstdint>
e qualifique totalmente cada tipo de número inteiro que você usa ou traga-o para o escopo com using std::int32_t;
etc (irritante porque prolixo, mas é a maneira certa de fazer isso como para qualquer outro símbolo na biblioteca padrão C ++)
- Use
<stdint.h>
(um pouco ruim porque obsoleto)
- Use
<cstdint>
e presuma que sua implementação colocará os símbolos no namespace global (muito ruim porque não é garantido).
Na prática, suspeito que uma grande quantidade de código irritante usa a última opção, simplesmente porque é fácil de fazer por acidente em uma implementação onde <cstdint>
coloca os símbolos no namespace global. Você deve tentar usar o primeiro. O segundo tem uma virtude, que é garantido colocar coisas no namespace global em vez de apenas fazer isso. Não acho isso particularmente útil, mas pode economizar um pouco de digitação se essa for sua prioridade.
Há uma quarta opção, #include <cstdint>
seguida da using namespace std;
que às vezes é útil, mas há lugares que você não deve colocar using namespace std;
. Pessoas diferentes terão idéias diferentes sobre onde esses lugares estão, mas "no nível superior em um arquivo de cabeçalho" é pior do que "no nível superior em um arquivo cpp", que é pior do que "em um escopo limitado". Algumas pessoas nunca escrevem using namespace std;
.
[*] Isso significa que os cabeçalhos padrão C ++ têm permissão para colocar coisas no namespace global, mas não é obrigatório. Portanto, você deve evitar a colisão com esses símbolos, mas não pode realmente usá-los porque eles podem não estar lá. Basicamente, o namespace global em C ++ é um campo minado, tente evitá-lo. Pode-se argumentar que o comitê ratificou uma prática por implementações que é quase tão prejudicial quanto furar using namespace std;
no nível superior em um arquivo de cabeçalho - a diferença é que as implementações só fazem isso para símbolos na biblioteca padrão C, enquanto o using namespace std;
faz para C ++ - apenas símbolos também. Há uma seção no padrão C que lista nomes reservados para adições futuras ao padrão. Não é uma ideia completamente estúpida tratar esses nomes como reservados no namespace global C ++ também, mas não é essencial.
<cstdint>
. Aqui está o erro que eu recebo:./misc.h:7:10: fatal error: 'cstdint' file not found
.