Pierwotnym zamiarem C ++ 98 było to, że powinieneś używać <cstdint>
w C ++, aby uniknąć zanieczyszczania globalnej przestrzeni nazw (cóż, nie <cstdint>
w szczególności, jest to dodawane tylko w C ++ 11, ale <c*>
ogólnie w nagłówkach).
Jednak implementacje i tak upierały się przy umieszczaniu symboli w globalnej przestrzeni nazw, a C ++ 11 ratyfikował tę praktykę [*]. Masz więc zasadniczo trzy opcje:
- Użyj
<cstdint>
i albo w pełni zakwalifikuj każdy typ liczb całkowitych, którego używasz, albo przenieś go do zakresu za pomocą using std::int32_t;
itp. (Irytujące, ponieważ gadatliwe, ale jest to właściwy sposób, aby to zrobić, tak jak w przypadku każdego innego symbolu w standardowej bibliotece C ++)
- Użycie
<stdint.h>
(nieco złe, ponieważ wycofane)
- Użyj
<cstdint>
i załóż, że Twoja implementacja umieści symbole w globalnej przestrzeni nazw (bardzo źle, ponieważ nie jest to gwarantowane).
W praktyce podejrzewam, że irytująca duża ilość kodu korzysta z ostatniej opcji, po prostu dlatego, że jest to łatwe do zrobienia przez przypadek w implementacji, w której <cstdint>
symbole są umieszczane w globalnej przestrzeni nazw. Powinieneś spróbować użyć pierwszego. Drugi ma tę zaletę, że gwarantuje umieszczenie rzeczy w globalnej przestrzeni nazw, a nie tylko może to robić. Nie sądzę, żeby to było szczególnie przydatne, ale może zaoszczędzić trochę pisania, jeśli jest to twój priorytet.
Jest czwarta opcja, #include <cstdint>
po using namespace std;
której czasami jest przydatna, ale są miejsca, w których nie powinieneś umieszczać using namespace std;
. Różni ludzie będą mieli różne pomysły, gdzie te miejsca się znajdują, ale „na najwyższym poziomie w pliku nagłówkowym” jest gorsze niż „na najwyższym poziomie w pliku cpp”, co jest gorsze niż „w ograniczonym zakresie”. Niektórzy using namespace std;
w ogóle nie piszą .
[*] Oznacza to, że standardowe nagłówki C ++ mogą umieszczać rzeczy w globalnej przestrzeni nazw, ale nie jest to wymagane. Musisz więc unikać kolizji z tymi symbolami, ale nie możesz ich użyć, ponieważ mogą ich tam nie być. Zasadniczo globalna przestrzeń nazw w C ++ jest polem minowym, staraj się go unikać. Można argumentować, że komitet ratyfikował praktykę poprzez implementacje, która jest prawie tak samo szkodliwa, jak trzymanie się using namespace std;
na najwyższym poziomie w pliku nagłówkowym - różnica polega na tym, że implementacje robią to tylko dla symboli w standardowej bibliotece C, podczas gdy using namespace std;
robi to dla C ++ -tylko symbole też. W standardzie C jest sekcja, która zawiera listę nazw zarezerwowanych dla przyszłych dodatków do standardu. Nie jest to całkowicie głupi pomysł, aby traktować te nazwy jako zarezerwowane również w globalnej przestrzeni nazw C ++, ale nie jest to konieczne.
<cstdint>
. Tutaj jest błąd otrzymuję:./misc.h:7:10: fatal error: 'cstdint' file not found
.