Должен ли я включить 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>
нет. Это почти конец. Это не будет устаревшим в ближайшее время, потому что есть куча программ, которые зависят от него.