Початковий намір у C ++ 98 полягав у тому, що вам слід використовувати <cstdint>
в C ++, щоб уникнути забруднення глобального простору імен (ну, не <cstdint>
зокрема, це додано лише в C ++ 11, але <c*>
загалом заголовки).
Однак реалізації все одно зберігали розміщення символів у глобальному просторі імен, і C ++ 11 підтвердив цю практику [*]. Отже, у вас є три варіанти:
- Використовуйте
<cstdint>
і повністю кваліфікуйте кожен цілий тип, який ви використовуєте, або вводьте його в область дії за допомогою using std::int32_t;
etc (дратує, тому що це багатослівно, але це правильний спосіб зробити це так само, як і для будь-якого іншого символу в стандартній бібліотеці C ++)
- Використання
<stdint.h>
(трохи погано, оскільки застаріло)
- Використовуйте
<cstdint>
і припустимо, що ваша реалізація помістить символи в глобальний простір імен (дуже погано, тому що не гарантована).
На практиці я підозрюю, що надокучлива велика кількість коду використовує останній варіант, просто тому, що це легко зробити випадково на реалізації, де <cstdint>
символи розміщуються в глобальному просторі імен. Спробуйте використовувати перший. Другий має одну перевагу: гарантовано розміщувати речі у глобальному просторі імен, а не лише робити це. Я не думаю, що це особливо корисно, але це може заощадити трохи набору тексту, якщо це ваш пріоритет.
Є четвертий варіант, #include <cstdint>
за using namespace std;
яким інколи корисний, але є місця, які ви не повинні ставити using namespace std;
. У різних людей будуть різні ідеї, де знаходяться ці місця, але "на верхньому рівні у файлі заголовка" гірше, ніж "на верхньому рівні у файлі cpp", що гірше, ніж "на обмеженому рівні". Деякі люди взагалі ніколи не пишуть using namespace std;
.
[*] Це означає, що стандартні заголовки C ++ дозволяють розміщувати речі у глобальному просторі імен, але цього не вимагають. Отже, вам слід уникати зіткнення з цими символами, але насправді ви не можете їх використовувати, оскільки їх може не бути. В основному, глобальний простір імен в C ++ - це мінне поле, намагайтеся уникати цього. Можна стверджувати, що комітет затвердив практику реалізацій, яка є майже такою ж шкідливою, як приклеювання using namespace std;
на верхній рівень у заголовковий файл - різниця полягає в тому, що реалізації роблять це лише для символів у стандартній бібліотеці C, тоді як using namespace std;
це робить для C ++ -Тільки символи теж. У стандарті С є розділ, в якому перелічені імена, зарезервовані для майбутніх доповнень до стандарту. Не зовсім дурна ідея також розглядати ці імена як зарезервовані в глобальному просторі імен С ++, але це не принципово.
<cstdint>
. Ось помилка я отримую:./misc.h:7:10: fatal error: 'cstdint' file not found
.