2008-10-18 4 views
26

При включении заголовочного файла в C++, какая разница между ...<iostream> против <iostream.h> против «iostream.h»

1), включая .h против не включая .h, когда окружив его < > знаки?

#include <iostream> vs. #include <iostream.h> 

2) обертывание имя заголовка в двойных кавычках по сравнению окружив его <> знаки?

#include <iostream.h> vs. #include "iostream.h" 

Заранее благодарен!

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename) для разницы между <> и "" , – aib 2008-10-18 00:56:53

ответ

46

Короче:

iostream.h осуждается - это оригинальная версия Страуструп и iostream является версией из комитета по стандартизации. Как правило, компиляторы указывают на них как на одно и то же, но у некоторых старых компиляторов не будет старшего. В некоторых нечетных случаях они будут существовать и быть разными (для поддержки устаревшего кода), и тогда вы должны быть конкретными.

«" против <> просто означает проверку локальных каталогов для заголовка перед переходом в библиотеку (в большинстве компиляторов).

-Adam

7

Здесь приличная ссылка article.

Подводя итог, мотивируя:

версии библиотеки iostream, что Комитет по стандартам производства было совсем немного отличается от реализации Cfront. {надрез}

Для облегчения перехода, Комитет по стандартам ++ С объявил, что код включая стандартный C++ заголовки будут использовать включать директивы, которые не имеют расширение. Это позволило поставщикам компилятора отправить старый стиль C++ библиотечные заголовки с расширением .h и новыми заголовками стилей без.

Преимущество не используется .h версии:

Есть несколько причин, почему новый код должен быть написан с использованием версии extensionless из заголовочных файлов вместо заголовочных форм. Сначала - это непредсказуемость такого кода при компиляции современных компиляторов . Как упоминалось ранее, результатом использования заголовков .h является конкретная реализация. И со временем вероятность того, что компилятор будет иметь доступную библиотеку старого стиля, будет уменьшаться.

+0

Просто то, что я искал, спасибо – Proclyon 2010-09-06 07:36:29

1

Обычно <> используется для системных или стандартных файлов библиотеки, тогда как для файлов проекта используется «». Я не удивлюсь, если ваш компилятор будет искать локально, и когда он не сможет найти его, он по умолчанию будет использовать стандартную версию библиотеки.

Что касается .h, я не думаю, что это имеет значение, если вы используете C. В C++ я смутно помню, что была более новая версия и более старая версия, и что без h она должна была быть новой версией, но я даже не уверен, что старая версия все еще существует.

2

Стандартный способ (и только один гарантированно работать) является <iostream>. В gcc, <iostream.h> (который может быть включен как < назад/iostream.h >) вытягивает соответствующие объявления в глобальное пространство имен (так что вам не нужен префикс пространства std :: namespace).

«iostream.h» будет пытаться сначала из каталога с вашим исходным кодом, так как «» предназначен для заголовков вашего проекта. < > всегда должен использоваться для заголовков системы и «» для ваших собственных заголовков.

+0

upvote для упоминания деклараций «.h» в глобальном масштабе и не нуждается в префиксе пространства имен std – 2017-06-06 12:51:27

0

Простой ответ на первый ответ заключается в том, что iostream.h не существует, по крайней мере, в реализации GCC. Если вы на * Nix, типа

% найти iostream.h
/usr/include/c++/3.4.3/backward/iostream.h

и

% найти iostream
/usr/include/c++/3.4.3/iostream
/usr/include/c++/3.4.3/backward/iostream.h

Как говорит статья Zee, в iostream.h для обратной совместимости.

1

Это действительно два разных вопроса.

  • Разница между .h и extensionless заголовков с тем же именем является историческим. Те, у которых есть .h расширение от оригинального стандарта C++, который не имеют некоторые современные функции, такие как пространства имен и шаблоны. Это было проще новый стандарт поставить те же функциональность в новых файлах заголовка, чтобы иметь возможность использовать эти новые функции и сохранить старые (.h) файлов для обратной совместимости унаследованного кода.

  • Разница между #include < ...> и #include «...» формат порядок, в котором компилятор ищет файлы. Это, как правило, зависит от реализации, но идея заключается в том, что <> формат выглядит в системы включают в себя каталоги первых, в то время как «» выглядит в той же директории как исходный файл, который #included его первым.

+1

Небольшая поправка к первой точке: iostream.h был предварительным и отличался от компиляторов. iostream был добавлен в первый стандарт C++. – KeithB 2008-10-19 22:32:32

5

Как человек в комитете по стандартизации (X3J16), который предложил убрав .h, мое первоначальное намерение состояло в том, чтобы урегулировать спор по поводу .h файла, .Н, .hpp, .hxx или .h ++ расширения; или желание некоторых, что в стандарте не подразумевается, что это было имя файла на диске, чтобы позволить IDE вытаскивать предварительно скомпилированную информацию заголовка из какого-то внутреннего, как файл ресурсов, или даже кишки компилятор.

Хотя Unix считал, что имя файла является одной строкой и на самом деле не признает концепцию расширения, операционные системы DEC имели традицию отделять имя от расширения и поставлять «расширение по умолчанию», если оно было опущено в конкретных контекстах. Вот откуда у меня появилась идея оставить это до реализации, чтобы использовать любое расширение, которое захотелось использовать, и это позволило реализации даже не иметь этот файл на диске. (Я был членом DEC в комитете в то время.)

Дифференциация между стандартными и предстандартными заголовками была дополнительным преимуществом.

+0

Прочитав несколько книг, я предположил, что `#include ` включает в себя ** определенный файл с именем iostream.h ** в нашей программе, тогда как `#include ` просто гарантирует, что все, принадлежащее библиотеке `iostream`, включены в нашу программу. Я прав? – 2014-11-17 16:06:15

Смежные вопросы