Должен ли я включить stddef.h или cstddef для размера t

когда я хочу использовать size_t в C++, я должен включить <stddef.h> или <cstddef>? Я слышал, как несколько человек говорили это <cstddef> была плохая идея, и она должна быть удалена. Почему так?

5 ответов


предпочитаю #include <stddef.h>.

некоторые имена в заголовках C могут быть макросами, но набор отличается от правил C. В C, EXIT_FAILURE, isdigit(), getc() а.о'. макросы. Вы знаете, какие из них являются макросы в C++?

во-вторых, только несколько стандартных заголовков C должны иметь <cfoo> заголовок, заголовки Posix не являются. Знаете ли вы, какие заголовки являются стандартными, а какие предоставляются только вашим компилятором?

в-третьих, при использовании заголовки из сторонней библиотеки C, вы в конечном итоге с #include <stddef.h>, и я предпочитаю не смешивать <stddef.h> и <cstddef>.

в-четвертых, в текущем проекте нового стандарта C++ говорится, что <cstdlib> разрешено сбрасывать символы в глобальное пространство имен (потому что, по-видимому, многие компиляторы уже делают это в настоящее время), поэтому с помощью #include <cstdlib> не является гарантией того, что глобальное пространство имен будет незагрязнено в будущем. Поэтому я бы посоветовал, что при написании портативного кода Вы должны принять глобальное пространство имен будет затронуто (даже если это не разрешено сейчас). Поскольку только несколько экспертов, похоже, знают это (см. обсуждение в комментариях здесь), лучше использовать <stddef.h> как даже начинающий программист C++ поймет, что он загрязняет глобальное пространство имен.


stddef.h - Это заголовок c. Имя size_t в глобальном пространстве имен в нем. <cstddef>, С другой стороны, является заголовком C++, который обертывает имена C в пространство имен std, что, естественно, является подходом C++, поэтому, если вы включаете <cstddef> и компилятор совместим, вам придется использовать std::size_t . Очевидно, что в C++ подход C++ более уместен. HTH

Edit: технически, заголовок C тоже мая содержат имена в пространство имен std. Но с-заголовки (те, которые заканчиваются .h) ввести имена также в глобальное пространство имен (тем самым загрязняя его) с помощью объявлений using.


<stddef.h> официально является устаревшей частью C++ (наряду с остальной частью приложения D стандарта C++). Все они являются (не устаревшими) частями стандартного C, поэтому, хотя они устарели в C++, они практически наверняка останутся доступными почти бесконечно.

много функций, которые не deprecated почти наверняка исчезнет первым -- export уже ушел из текущего проекта C++0x, и если бы мне пришлось угадать, я бы сказал исключение спецификации были намного более вероятными, чем приложение D. Когда / если эти заголовки действительно устареют, это, вероятно, будет из зрелой версии предложения модулей Дэвида Вандервурда, которое может легко рендерить все заголовки устарело.

в то же время, значительное количество компиляторов (особенно старые) не использовать тег <c*> заголовки точно так, как предписывает стандарт. Если вы хотите / должны написать код, который работает с ними, вы получите совсем немного с помощью <*.h> заголовки вместо <c*> заголовки.

в конечном счете, я думаю, что <c*> заголовки были решением в поисках проблемы. Стандарт C требует, чтобы эти заголовки только определите имена, которые требуются - никаких других, кроме зарезервированных имен, таких как с начальным подчеркиванием, за которым следует другое подчеркивание или заглавная буква. Зарезервированные имена (и еще несколько) также зарезервированы в C++, поэтому они не могут сталкиваться ни с чем в переносном коде в любом случае. Таким образом, все <c*> headers buy you-это возможность определить имя в глобальном пространстве имен, которое сталкивается с существующим именем в стандартной библиотеке C. Это такая потрясающе ужасная идея, что даже не стоит и думать об этом, поэтому с практической точки зрения вы ничего не получили.

Edit: даже эта бесполезная возможность работала с несколькими достаточно реальными компиляторами, которые текущие проекты восходящего расчесывания C++0x дают разрешение на <c*> заголовки загрязняют глобальное пространство имен в любом случае, поэтому даже теоретическое преимущество исчезло.


оба находятся в стандарте и, AFAIK, там, чтобы остаться.

форма cXXX всегда вводит имена в пространствах имен std, форма XXX.h всегда вводит имена в глобальное пространство имен. Оба могут также поместить имена в другое пространство имен (по крайней мере, в C++0X это не было ранее. Поскольку соблюдение этого ограничения делает невозможным создание библиотеки C++ из библиотеки C, которую вы не контролируете, ограничение было удалено. г++ страдает от этой проблемы, по крайней мере, на glibc targets).

для традиционных заголовков Unix во всей реализации я тестировал форму XXX.h включает дополнительный идентификатор Unix, если у вас есть необходимые макросы функций, определенные ранее. Поведение для формы cXXX было несовместимым между реализациями. Поэтому на практике я использую XXX.h поскольку мне часто нужны эти заявления.


<cstddef> и <stddef.h> нет. Это почти конец. Это не будет устаревшим в ближайшее время, потому что есть куча программ, которые зависят от него.