Разница между использованием # include <filename>и #include <filename.h> в C ++ - PullRequest
26 голосов
/ 19 ноября 2008

В чем разница между использованием #include<filename> and #include<filename.h> в C ++ ? Какой из двух используется и почему он используется?

Ответы [ 5 ]

32 голосов
/ 19 ноября 2008

Только для C ++ include-файлы, не найденные в стандарте 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 ++ (например, перегруженные математические функции для float, long)
  • C заголовки совместимости (filename.h) могут исчезнуть в будущем.
18 голосов
/ 19 ноября 2008

#include <foo.h> был распространен в коде C ++ до стандарта C ++. Стандарт изменил его на #include <foo> с заголовком, помещенным в пространство имен std. (Спасибо litb за указание на то, что стандарт никогда не разрешал заголовки .h.)

Никакой магии не происходит, первый ищет файл с именем «foo.h», а второй - файл с именем «foo». Это два разных файла в файловой системе. Стандарт только что изменил имя файла, который должен быть включен.

В большинстве компиляторов старые заголовки все еще существуют для обратной совместимости (и совместимости с C), но современные программы на C ++, которые хотят следовать стандарту, не должны их использовать.

В случае стандартных заголовков C версии C ++ имеют в начале символ c, поэтому заголовок C

#include <stdio.h>

становится

#include <cstdio>
4 голосов
/ 19 ноября 2008

Старый стандарт использовал синтаксис #include <filename.h>. Когда к языку были добавлены пространства имен и шаблоны, стандарт был изменен на #include <filename>.

Это было сделано для того, чтобы содержимое стандартной библиотеки могло быть помещено в пространство имен std. Более старый код, который не имел понятия о пространствах имен, все равно будет работать, поскольку файлы #include <filename.h> не используют пространства имен.

Новый код должен всегда использовать формат #include <filename>. Если вы используете старый формат, все символы, которые они определяют, будут помещены в глобальное пространство имен, а не в std.

2 голосов
/ 19 ноября 2008

Если вы говорите о стандартных библиотеках (потому что иначе они вообще не будут работать), разница будет

#include< header >
//my code

- это правильный способ вызова заголовка в соответствии со стандартом C ++, тогда как

#include< header.h >
//my code

устарело (в стандарте C ++, но все еще необходимо в соответствии со стандартом C99) и вместе с остальным багажом C.

Так что вы должны использовать:

#include< cmath >
//my code

не

#include< math.h >
//my code
0 голосов
/ 19 ноября 2008

Те, у кого нет .h - это заголовочные файлы C ++, а те, у которых .h - это заголовочные файлы C. Это относится только к стандартным заголовочным файлам в C ++.

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

...