Die ursprüngliche Absicht in C ++ 98 war, dass Sie <cstdint>
in C ++ verwenden sollten, um eine Verschmutzung des globalen Namespace zu vermeiden (nicht <cstdint>
speziell, das wird nur in C ++ 11 hinzugefügt, sondern die <c*>
Header im Allgemeinen).
Die Implementierungen bestanden jedoch weiterhin darin, die Symbole in den globalen Namespace einzufügen, und C ++ 11 bestätigte diese Vorgehensweise [*]. Sie haben also grundsätzlich drei Möglichkeiten:
- Verwenden
<cstdint>
Sie jeden von Ihnen verwendeten Integer-Typ und qualifizieren Sie ihn entweder vollständig oder bringen Sie ihn mit using std::int32_t;
etc in den Geltungsbereich (ärgerlich, weil ausführlich, aber es ist der richtige Weg, dies wie bei jedem anderen Symbol in der C ++ - Standardbibliothek zu tun).
- Verwendung
<stdint.h>
(etwas schlecht, weil veraltet)
- Verwenden Sie
<cstdint>
und nehmen Sie an, dass Ihre Implementierung die Symbole in den globalen Namespace einfügt (sehr schlecht, weil nicht garantiert).
In der Praxis vermute ich, dass eine ärgerlich große Menge an Code die letzte Option verwendet, einfach weil es bei einer Implementierung, bei <cstdint>
der die Symbole in den globalen Namespace eingefügt werden, einfach ist, dies versehentlich zu tun . Sie sollten versuchen, die erste zu verwenden. Die zweite hat eine Tugend, dass es garantiert ist , Dinge in den globalen Namespace zu stellen, anstatt es vielleicht nur zu tun. Ich denke nicht, dass dies besonders nützlich ist, aber es könnte einige Eingaben ersparen, wenn dies Ihre Priorität ist.
Es gibt eine vierte Option, #include <cstdint>
gefolgt von using namespace std;
der manchmal nützlich ist, aber es gibt Stellen, an denen Sie die nicht setzen sollten using namespace std;
. Unterschiedliche Personen haben unterschiedliche Vorstellungen, wo sich diese Orte befinden, aber "auf oberster Ebene in einer Header-Datei" ist schlechter als "auf oberster Ebene in einer CPP-Datei", was schlechter ist als "in einem begrenzten Bereich". Manche Leute schreiben using namespace std;
überhaupt nicht.
[*] Das bedeutet, dass C ++ - Standardheader Inhalte in den globalen Namespace einfügen dürfen, dies jedoch nicht. Sie müssen also vermeiden, mit diesen Symbolen zu kollidieren, können sie jedoch nicht verwenden, da sie möglicherweise nicht vorhanden sind. Grundsätzlich ist der globale Namespace in C ++ ein Minenfeld. Versuchen Sie es zu vermeiden. Man könnte argumentieren, dass das Komitee eine Praxis durch Implementierungen ratifiziert hat, die fast so schädlich ist wie das Festhalten using namespace std;
auf oberster Ebene in einer Header-Datei - der Unterschied besteht darin, dass die Implementierungen dies nur für Symbole in der C-Standardbibliothek tun, während using namespace std;
dies für C ++ der Fall ist -nur Symbole auch. Es gibt einen Abschnitt im C-Standard, in dem Namen aufgeführt sind, die für zukünftige Ergänzungen des Standards reserviert sind. Es ist keine völlig dumme Idee, diese Namen auch im globalen C ++ - Namespace als reserviert zu behandeln, aber es ist nicht unbedingt erforderlich.
<cstdint>
. Hier ist der Fehler, den ich erhalte :./misc.h:7:10: fatal error: 'cstdint' file not found
.