В чем разница между использованием #include<filename> and #include<filename.h
> в C ++? Что из двух используется и почему?
Разница между использованием #include ‹filename› и #include ‹filename.h› в C ++
Ответы (5)
Включаемые файлы только C ++, не входящие в стандарт C, никогда не использовались filename.h
. С момента выхода самого первого стандарта C ++ (1998 г.) они использовали filename
для своих собственных заголовков.
Файлы, унаследованные стандартом C, стали cfilename
вместо filename.h
. Унаследованные файлы C, используемые как filename.h
, устарели, но по-прежнему являются частью стандарта C ++.
Разница в том, что имена, не определенные как макросы в C, находятся в пространстве имен std::
в cfilename
в C ++, а имена в filename.h
находятся в области глобального пространства имен. Таким образом, вы найдете ::size_t
в stddef.h и std::size_t
в cstddef. Оба являются стандартным C ++, но использование :: size_t не рекомендуется (см. Приложение D к стандарту C ++).
Вот в чем разница.
Зачем вам использовать `filename.h`?
- Совместимость с компиляторами C
- Совместимость с очень старыми компиляторами C ++
Почему вам следует использовать cfilename?
- Имена находятся в пространстве имен
std::
. Больше никаких именных столкновений. - Новые возможности C ++ (например, перегруженные математические функции для чисел с плавающей запятой, long)
- Заголовки совместимости C (
filename.h
) могут исчезнуть в будущем.
filename.h
в C ++. Они сломали бы слишком много программ и рассердили бы слишком много клиентов / разработчиков.
- person Tom Barta; 20.11.2008
#include "foo.h"
и #include "foo"
? Извините, я новичок.
- person Friendly Ghost; 04.09.2018
#include <foo.h>
был распространен в коде C ++ до стандарта C ++. Стандарт изменил его на #include <foo>
, где все из заголовка было помещено в пространство имен std
. (Спасибо litb за указание на то, что в стандарте никогда не разрешались заголовки .h.)
Никакого волшебства не происходит, первый ищет файл с именем «foo.h», а второй - файл с именем «foo». Это два разных файла в файловой системе. Стандарт просто изменил имя файла, который должен быть включен.
В большинстве компиляторов старые заголовки все еще существуют для обратной совместимости (и совместимости с C), но современные программы на C ++, которые хотят следовать стандарту, не должны их использовать.
В случае стандартных заголовков C версии C ++ имеют в начале c, поэтому заголовок C
#include <stdio.h>
становится
#include <cstdio>
В старом стандарте использовался синтаксис #include <filename.h>
. Когда к языку были добавлены пространства имен и шаблоны, стандарт был изменен на #include <filename>
.
Это было сделано для того, чтобы все стандартные библиотеки можно было разместить в пространстве имен std. Старый код, в котором не было концепции пространств имен, все равно будет работать, поскольку файлы #include <filename.h>
не используют пространства имен.
Новый код должен всегда использовать формат #include <filename>
. Если вы используете старый формат, все символы, которые они определяют, будут помещены в глобальное пространство имен, а не в std.
Файлы без .h - это файлы заголовков C ++, а файлы с .h - файлы заголовков C. Это относится только к стандартным файлам заголовков в C ++.
Если вы включаете свои собственные файлы или файлы, которые не являются частью стандартного C ++, вам всегда нужно писать полное имя файла (которое может быть любым).
Если вы говорите о стандартных библиотеках (потому что иначе они вообще не работают), разница в том, что
#include< header >
//my code
- это правильный способ вызвать заголовок в соответствии со стандартом C ++, а
#include< header.h >
//my code
устарел (в стандарте C ++, но по-прежнему необходим в соответствии со стандартом C99) и поставляется вместе с остальным багажом C.
Итак, вы должны использовать:
#include< cmath >
//my code
нет:
#include< math.h >
//my code
<foo>
и<foo.h>
, тогда как связанный вопрос о<foo(.h)>
vs"foo(.h)"
. Связанный вопрос, безусловно, является связанным и полезным ресурсом, но это не дубликат. - person Heinzi   schedule 12.05.2017