Является ли плохой практикой использование заголовка C вместо его эквивалента C ++ в C ++ (например, stdio.h вместо cstdio)? - PullRequest
3 голосов
/ 16 апреля 2010

Кажется, что многие люди включают example.h вместо cexample в свой код C ++. Я знаю, что все в версиях C ++ объявлено в пространстве имен std, но я не знаю никаких других отличий. Так почему люди используют заголовки C, и это нормально?

Ответы [ 4 ]

4 голосов
/ 16 апреля 2010

Разница между ними заключается в том, что импортированные C ++ заголовки C (с префиксом c и удалением суффикса .h) находятся в пространстве имен std. Это означает, что любой вызов или использование стандартного средства имеет префикс std:: для единообразия. Это Стандартный способ делать вещи (тм) . Если, конечно, у вас уже есть набор кода на C, в котором вам не хочется добавлять std:: к каждому стандартному вызову: используйте классические заголовки C.

2 голосов
/ 16 апреля 2010

Например, stdio.h отличается от cstdio. Последний включает первый, но затем отменяет определение некоторых макросов и заменяет их реальными функциями. Лично я бы всегда использовал заголовки C ++!

1 голос
/ 16 апреля 2010

при работе с C ++ я предпочитаю использовать синтаксис заголовка C ++, если нет причин не делать этого. Также представляется более безопасным использовать <name> (без синтаксиса .h) на основе следующих комментариев в стандарте:

Раздел 17.4.1.2, пункты 3 и 4 (ИСО / МЭК 14882, второе издание 2003-10-15):

Средства стандартной библиотеки C представлены в 18 дополнительных заголовках, как показано в таблице 12:

Затем списки со стола, например, <cassert>, <ciso646>, ... и затем продолжает

За исключением случаев, указанных в пунктах 18–27, содержимое каждого заголовка cname должно быть таким же, как и содержимое соответствующего заголовка name .h ....

Таким образом, стандарт определяет заголовки без .h, но указывает, что по большей части они идентичны тем, которые предоставляются компилятором C, и предоставляет пункты 18-27 для определения различий.

К сожалению, я не могу понять, где находятся эти разделы в стандарте, чтобы можно было документировать различия, если они будут полезны.

Я не верю, что существует требование наличия заголовков .h при использовании компилятора C ++.

Как отметил @James в комментарии, в разделе D.5, параграфы 1 и 2 говорится, что заголовки C должны присутствовать:

... Стандартная библиотека C ++ предоставляет 18 заголовков C ....

Каждый заголовок C, каждый из которых имеет имя вида name .h, ведет себя так, как будто каждое имя, помещенное в пространство имен стандартной библиотеки соответствующим заголовком cname , также помещается в пределах пространства имен пространства имен std, за которым следует явное объявление использования (7.3.3)

1 голос
/ 16 апреля 2010

Все нормально.Но кажется, что лучше использовать стиль C ++ (т.е. без расширения .h) в коде C ++.Я не буду (и не буду) беспокоиться об этом.

...