L'intenzione originale in C ++ 98 era che dovresti usare <cstdint>
in C ++, per evitare di inquinare lo spazio dei nomi globale (beh, non <cstdint>
in particolare, viene aggiunto solo in C ++ 11, ma le <c*>
intestazioni in generale).
Tuttavia, le implementazioni persistevano comunque nel mettere i simboli nello spazio dei nomi globale e C ++ 11 ha ratificato questa pratica [*]. Quindi, fondamentalmente hai tre opzioni:
- Usa
<cstdint>
e qualifica completamente ogni tipo di intero che usi oppure portalo nell'ambito con using std::int32_t;
ecc (fastidioso perché prolisso, ma è il modo giusto per farlo proprio come per qualsiasi altro simbolo nella libreria standard C ++)
- Usa
<stdint.h>
(leggermente scadente perché deprecato)
- Usa
<cstdint>
e presumi che la tua implementazione metta i simboli nello spazio dei nomi globale (pessimo perché non garantito).
In pratica sospetto che una fastidiosa grande quantità di codice utilizzi l'ultima opzione, semplicemente perché è facile farlo per sbaglio su un'implementazione in cui <cstdint>
mette i simboli nel namespace globale. Dovresti provare a usare il primo. Il secondo ha una virtù, che è garantito mettere 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 dalla using namespace std;
quale a volte è utile, ma ci sono posti in cui non dovresti mettere il file using namespace std;
. Persone diverse avranno idee diverse su dove siano quei posti, ma "al livello più alto in un file di intestazione" è peggio di "al livello superiore in un file cpp", che è peggio che "in un ambito limitato". Alcune persone non scrivono mai using namespace std;
.
[*] Ciò significa che le intestazioni standard C ++ possono inserire cose nello spazio dei nomi globale ma non è obbligatorio. Quindi devi evitare di entrare in collisione con quei simboli, ma non puoi effettivamente usarli perché potrebbero non essere lì. 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 è dannosa quasi quanto using namespace std;
rimanere al livello più alto in un file di intestazione - con la differenza che le implementazioni lo fanno solo per i simboli nella libreria standard C, mentre lo using namespace std;
fa per C ++ -solo anche simboli. C'è una sezione nello standard C che elenca i nomi riservati per future aggiunte allo standard. Non è un'idea completamente stupida trattare quei nomi come riservati anche nello spazio dei nomi globale C ++, ma non è essenziale.
<cstdint>
. Ecco l'errore che ricevo:./misc.h:7:10: fatal error: 'cstdint' file not found
.