В чем разница между использованием #include<filename> and #include<filename.h
> в С++? Какое из двух используется и почему оно используется?
Разница между использованием #include <имя_файлa> и #include <filename.h> в С++
Ответ 1
Только С++ include файлы, не найденные в стандарте C, никогда не использовались filename.h
. Поскольку появился первый С++ Standard (1998), они использовали filename
для своих собственных заголовков.
Файлы, унаследованные стандартом C, стали cfilename
вместо filename.h
. C файлы, унаследованные, используемые как filename.h
, устарели, но все еще являются частью стандарта С++.
Разница заключается в том, что имена, не определенные как макросы в C, находятся в пространстве имен std::
в cfilename
в С++, а имена в filename.h
находятся в области глобального пространства имен. Итак, вы найдете ::size_t
в stddef.h и std::size_t
в cstddef. Оба являются стандартными С++, но использование:: size_t устарело (см. Приложение D стандарта С++).
Теперь это была разница.
Почему вы используете `filename.h`?
- Совместимость с компиляторами C
- Совместимость с очень старыми компиляторами на С++
Почему вы должны использовать `cfilename`?
- Имена находятся в пространстве имен
std::
. Больше никаких конфликтов имен. - Новые возможности С++ (например, перегруженные математические функции для float, long)
- C Заголовки совместимости (
filename.h
) могут исчезнуть в будущем.
Ответ 2
#include <foo.h>
был распространен в коде С++ до стандарта С++. Стандарт изменил его на #include <foo>
на все, начиная с заголовка, помещенного в пространство имен std
. (Благодаря лампочке, указав, что стандарт никогда не позволял .h заголовков.)
Волшебства не происходит, первый ищет файл с именем "foo.h", а второй - для файла с именем "foo". Это два разных файла в файловой системе. Стандарт просто изменил имя файла, который должен быть включен.
В большинстве компиляторов старые заголовки все еще существуют для обратной совместимости (и совместимости с C), но современные С++-программы, которые хотят следовать стандарту, не должны их использовать.
В случае стандартных заголовков C, версии С++ имеют c в начале, поэтому заголовок C
#include <stdio.h>
становится
#include <cstdio>
Ответ 3
В старом стандарте использовался синтаксис #include <filename.h>
. Когда к языку были добавлены пространства имен и шаблоны, стандарт был изменен на #include <filename>
.
Это было сделано так, чтобы материал стандартной библиотеки мог быть помещен в пространство имен std. Более старый код, который не имел понятия пространств имен, по-прежнему работал бы, поскольку файлы #include <filename.h>
не используют пространства имен.
Новый код должен всегда использовать формат #include <filename>
. Если вы используете более старый формат, все символы, которые они определяют, будут помещены в глобальное пространство имен, а не в std.
Ответ 4
Если вы говорите о стандартных библиотеках (поскольку в противном случае это вообще не работает), разница составляет
#include< header >
//my code
- правильный способ вызова заголовка в соответствии со стандартом С++, а
#include< header.h >
//my code
устарел (в стандарте С++, но все же необходим в соответствии со стандартом C99) и пришел вместе с остальной частью багажа C.
Итак, вы должны использовать:
#include< cmath >
//my code
не
#include< math.h >
//my code
Ответ 5
Те, у кого нет .h, являются заголовочными файлами С++, а те, у которых есть .h, - это файлы заголовков C. Это относится только к стандартным файлам заголовков в С++.
Если вы включаете свои собственные файлы или файлы, которые не являются частью стандартного С++, вам нужно всегда писать полное имя файла (что может быть что угодно).