Qual é a diferença entre stdint.h
e cstdint
?
Ambos estão disponíveis em MSVC (Visual Studio 2010) e gcc-4.5.1. Além disso, ambos definem os tipos intX_t
/ uintX_t
(onde X
é o tamanho em bytes do tipo).
- Se a lógica em ambos os cabeçalhos for a mesma (tipos portáteis), que decisões devo tomar para decidir sobre um ou outro?
O stdint.h
define cada tipo sem nenhum namespace, os cstdint
tipos estão no std
namespace.
- Há algum motivo para incluir ou não os tipos definidos no
std
namespace? O que é diferente entre os dois cabeçalhos?
cstdint
não tem extensão de arquivo e usa o c
prefixo, stdint.h
usa a .h
extensão.
- Quais são as convenções de nomenclatura para esses cabeçalhos? o
c
prefixo indica que esta é uma biblioteca C? há uma razão para a falta de extensão de arquivo emcstdint
?
<cstdint>
. Aqui está o erro que eu recebo:./misc.h:7:10: fatal error: 'cstdint' file not found
.Respostas:
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:
<cstdint>
e qualifique totalmente cada tipo de número inteiro que você usa ou traga-o para o escopo comusing 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 ++)<stdint.h>
(um pouco ruim porque obsoleto)<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 dausing namespace std;
que às vezes é útil, mas há lugares que você não deve colocarusing 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 escrevemusing 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 ousing 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.fonte
<iostream>
,<vector>
,<cstdlib>
, para além de os incluídos para compatibilidade C:<stdint.h>
,<stdlib.h>
. E sim, a inicialc
indica que<cstdlib>
é o equivalente em C ++ do cabeçalho padrão C<stdlib.h>
, em vez de ser totalmente novo em C ++ como<vector>
é. Há um cabeçalho C ++<complex>
, então, teremos que torcer para que nenhuma versão futura do C introduza um cabeçalho padrão<omplex.h>
.<omplex.h>
, não<complex.h>
. Se C adicionado<omplex.h>
, o equivalente em C ++ seria<complex>
.Incluir
cstdint
importa os nomes dos símbolos no namespace std e possivelmente no namespace Global.Incluir
stdint.h
importa os nomes dos símbolos no namespace global e possivelmente no namespace std.Os recursos da biblioteca padrão C também são fornecidos na biblioteca padrão C ++ e, como uma convenção geral de nomenclatura, eles são precedidos por um c aos nomes correspondentes na biblioteca padrão C.
Em C ++, você deve usar:
e qualificar totalmente os nomes de símbolo que você usa
std::
enquanto em C, você deve usar:
Anexo D (normativo) Características de compatibilidade [depr] estados:
Cabeçalhos de biblioteca padrão D.6 C
Que incluem:
E além disso,
fonte
cstdint
é o cabeçalho C ++ 11,stdint.h
é o cabeçalho C99 (C e C ++ são linguagens diferentes!)MSVC 2008 não contém
stdint.h
nemcstdint
.A
cstdint
maioria das implementações de são simplesmente#include <stdint.h>
com algumas correções de namespace / linguagem.fonte
cstdint
precisa içar as implementações para o namespacestd
.stdint.h
. Não há nenhum argumento quecstdint
seja um cabeçalho C ++.stdint.h
não faz parte do C ++ 11. Na verdade, é exigido pelo C ++ 11. Você poderia dizer, "int
está em C ++ 11;long
está em C99; C e C ++ são linguagens diferentes!", E nenhuma parte disso também seria falsa. Meu exemplo é ainda mais enganoso, pois C ++ 11 se refere em parte a C99 para definir o conteúdo de ambosstdint.h
ecstdint
, mas não se refere a C para definirint
.