Разница между использованием #include <имя_файлa> и #include <filename.h> в С++

В чем разница между использованием #include<filename> and #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. Это относится только к стандартным файлам заголовков в С++.

Если вы включаете свои собственные файлы или файлы, которые не являются частью стандартного С++, вам нужно всегда писать полное имя файла (что может быть что угодно).