Вы должны указать это с помощью директивы using.
using std::size_t;
Добавьте его либо в глобальную область видимости каждой единицы компиляции, либо в локальные области, если это вызовет помехи в глобальной области.
stddef.h также работает, как вы заметили, и, честно говоря, этот метод не «хуже», чем этот. Однако stddef.h является заголовком обратной совместимости, и, возможно, лучше не полагаться на него в новом коде.
Я предпочитаю директиву using, потому что она не загрязняет глобальное пространство имен там, где это вам не нужно, и не полагается на поддержку нестандартного поведения произвольным компилятором. Кроме того, это общепринятый способ переноса типа в пространство имен, когда в противном случае возможны несколько параметров, поэтому он не является уникальным для использования size_t.
Это не совсем то, на что человек может авторитетно ответить. Я был профессиональным разработчиком в течение 10 лет и работаю с C ++ с 1998 года, но я никогда не увижу статистически значимой части всего написанного кода C ++. Судя по тому, что я видел, существует множество кода, который все еще использует stddef.h, и он вряд ли сломается в ближайшее время.
Для нового кода я предпочитаю просто набирать везде префикс «std ::», применяя директивы using только тогда, когда он становится громоздким или трудным для чтения. Однако я понимаю, что это может раздражать «унаследованный» код, в котором директивы using в области видимости файла лучше. Если у вас есть время для правильного рефакторинга унаследованного кода, есть хороший аргумент, что вы должны это сделать, но, скорее всего, это будет связано не только с переменными size_t.
Я также должен упомянуть, что в C ++ FAQ (пункт 27.5) также упоминается эта проблема здесь, где у меня сложилось впечатление, что они в основном рекомендуют согласованность с другими членами вашей команды.
Я хочу отметить здесь, что НЕ является хорошей практикой применять "using namespace std" в области видимости файла, хотя это также приведет к включению size_t в глобальное пространство имен. Я приведу причину этого здесь.
Кажется, я напугал tuple_cat (извините), но я действительно думал, что его эмпирический метод был хорош, поэтому я пытаюсь внести некоторые изменения, чтобы разрешить мои опасения по поводу его ответа. Я попытался выполнить поиск в github со следующими измененными запросами, которые, по общему признанию, все еще могут иметь некоторые проблемы:
A) "size_t" AND "stddef.h" language:c++
B) "std::size_t" AND "<cstddef>" language:c++
C) "size_t" AND "<cstddef>" AND NOT "std::size_t" language:c++
D) "size_t" AND "<cstddef>" AND "using namespace std" AND NOT "std::size_t" language:c++
E) "size_t" AND "<cstddef>" AND "using std::size_t" language:c++
Получаю следующее:
- A) 974 239 результатов (подход stddef.h)
- B) 1 230 021 результат (подход cstddef с префиксом "std ::")
- C) 469 721 результат (подход cstddef, без префиксов)
- D) 32 539 результатов (подход cstddef, «использование пространства имен std», НЕ ДЕЛАЙТЕ ЭТО!)
- E) 27 080 результатов (рекомендую метод "using std :: size_t")
Он определенно не идеален, и я приветствую критику, чтобы сделать его лучше, но похоже, что метод, который я рекомендую, как уже было сказано, не самый популярный. Судя по данным, наиболее популярным является использование префиксов «std ::» для size_t (B) с последующим включением «stddef.h» (A). К счастью, плохой подход (D) не популярен, но похоже, что многие люди могут полагаться на другие файлы / заголовки, чтобы перенести size_t в глобальное пространство имен, или просто надеяться, что он уже есть в компиляторе (C).
Следовательно, чтобы «идти в стадо», вы должны все добавить с помощью «std ::». Если вы не хотите этого делать, то "stddef.h" также очень часто используется, но я все же предпочитаю директиву using.
person
Bob Miller
schedule
14.03.2017
size_t
в качестве индексной переменной не требуется. Можно использовать любой интегральный тип, если его диапазон охватывает диапазон индексов.size_t
- это просто тип, который гарантированно охватывает любой возможный диапазон индексов. Я полагаю, когда вы говорите, что это имя неприемлемо, вы имеете в виду, что оно вам лично не нравится. Мне это очень нравится. - person Keith Thompson   schedule 15.03.2017#include <cstddef>
иstd::size_t
, но я не утверждаю, что это принято или популярно. - person Keith Thompson   schedule 15.03.2017size_t
не приходит из разных мест. Если вы имеете в виду несколько мест в стандартной библиотеке - ну, это правда, но это одно и то жеsize_t
. Можете ли вы показать примерsize_t
поступающих из разных (широко используемых) мест? - person einpoklum   schedule 16.03.2017::size_t
, если это стандартная библиотека C, либоstd::size_t
, если это ее разновидность C ++. - person einpoklum   schedule 18.03.2017