L'intenzione originale in C++ 98 era che si dovrebbe usare <cstdint>
in C++, per evitare di inquinare il namespace globale (beh, non <cstdint>
in particolare, che viene aggiunto solo in C++ 11, ma il <c*>
intestazioni in generale).
Tuttavia, le implementazioni persistevano nel mettere i simboli nello spazio dei nomi globale comunque, e C++ 11 ratificava questa pratica [*]. Quindi, che, fondamentalmente, sono disponibili tre opzioni:
- Utilizzare
<cstdint>
e sia pienamente qualificare ogni tipo integer si usa oppure portarlo in ambito con using std::int32_t;
etc (fastidioso perché prolisso, ma è il modo giusto per farlo, proprio come per qualsiasi altro simbolo nella libreria standard C++)
- Usa
<stdint.h>
(leggermente male perché sconsigliato)
- Usa
<cstdint>
e assumere l'implementazione metterà i simboli nel namespace globale (molto male perché non garantita).
In pratica ho il sospetto che una grande quantità fastidiosa di codice utilizza l'ultima opzione, semplicemente perché è facile da fare per caso su un'implementazione dove <cstdint>
mette i simboli nel namespace globale. Dovresti provare a usare il primo. Il secondo ha una virtù, che è garantito per mettere le cose nello spazio dei nomi globale invece di farlo solo forse. Non penso che sia particolarmente utile, ma potrebbe risparmiare un po 'di digitazione se questa è la tua priorità.
C'è una quarta opzione, #include <cstdint>
seguita da using namespace std;
che a volte è utile ma ci sono posti che non dovresti mettere il using namespace std;
. Persone diverse avranno idee diverse in quei luoghi, ma "al livello più alto in un file di intestazione" è peggio di "al livello più alto in un file cpp", che è peggio di "in un ambito limitato". Alcune persone non scrivono mai using namespace std;
affatto.
[*] Ciò significa che le intestazioni standard C++ sono autorizzate a inserire elementi nello spazio dei nomi globale ma non sono obbligati a farlo. Quindi devi evitare di scontrarti con quei simboli, ma non puoi effettivamente usarli perché potrebbero non esserci. Fondamentalmente, lo spazio dei nomi globale in C++ è un campo minato, cerca di evitarlo.Si potrebbe obiettare che il comitato ha ratificato una pratica con implementazioni che sono quasi altrettanto dannose come attaccare using namespace std;
al livello più alto in un file di intestazione - la differenza è che le implementazioni lo fanno solo per i simboli nella libreria standard C, mentre using namespace std;
lo fa per C++ - anche solo simboli. C'è una sezione nello standard C che elenca i nomi riservati per future aggiunte allo standard. Non è un'idea completamente stupida trattare questi nomi come riservati nello spazio dei nomi globale C++, ma non è essenziale.
fonte
2012-11-30 10:08:03
OS X 10.8 manca ''. Ecco l'errore che ricevo: * './Misc.h: 7: 10: errore fatale: 'cstdint' file non trovato' *. –
jww
Correlati: [Quando si usano le intestazioni C in C++, dovremmo usare le funzioni da std :: o dallo spazio dei nomi globale?] (Http://stackoverflow.com/q/32606023/2020827) – sergej