Для целей этого вопроса меня интересует только стандартно-совместимый С++, а не C или С++ 0x, а не детали, специфичные для реализации.
Questions время от времени возникают разница между #include ""
и #include <>
. Аргумент обычно сводится к двум отличиям:
- Конкретные реализации часто ищут разные пути для двух форм. Это зависит от платформы и не относится к сфере этого вопроса.
- Стандарт говорит, что
#include <>
предназначен для "заголовков", тогда как#include ""
предназначен для "исходного файла". Вот ссылка:
ISO/IEC 14882: 2003 (E)
16.2 Включение исходного файла [cpp.include]
1 Директива #include должна идентифицировать заголовок или исходный файл, который может быть обработан реализацией.
2 Директива предварительной обработки формы
ищет последовательность определенных для реализации мест для заголовка , идентифицированного однозначно по указанной последовательности между символами < и → и вызывает замену этой директивы на все содержимое заголовка. Как указаны места или идентифицированный заголовок определяется реализацией.# include < h-char-sequence > new-line
3 Директива предварительной обработки формы
вызывает замену этой директивы всем содержимым исходного файла , идентифицированного указанной последовательностью между "разделителями". Именованный исходный файл выполняется поисковым способом. Если этот поиск не является поддерживается, или если поиск не выполняется, директива перерабатывается, как если бы она читалась# include "q-char-sequence" new-line
с идентичной содержащейся последовательностью (включая > символы, если таковые имеются) из исходной директивы.# include < h-char-sequence > new-line
(Акцент в приведенной выше цитате мой.) Подразумевается, что эта разница, по-видимому, заключается в том, что стандарт намеревается различать "заголовок" и "исходный файл", но нигде в документе не определено ни одно из этих терминов, ни разница между ними.
Есть несколько других мест, где упоминаются заголовки или исходные файлы. Несколько:
158) Заголовок не обязательно является исходным файлом, равно как и последовательности, ограниченные именами заголовков, обязательно являются допустимыми именами исходных файлов (16.2).
Похоже, что заголовок может не находиться в файловой системе, но он также не говорит, что файлы исходного кода тоже.
2 Лексические условные обозначения [lex]
1 Текст программы хранится в единицах, называемых исходными файлами в этом Международном стандарте. Исходный файл вместе со всеми заголовками (17.4.1.2) и исходными файлами, включенными (16.2) через директиву предварительной обработки
#include
, меньше любых строк исходного кода, пропущенных любыми директивами предварительной обработки условного включения (16.1), называется единицей трансляции, [Примечание: программа C + + не обязательно должна быть переведена одновременно. ]
Это наиболее близкое к определению определение, и, похоже, заголовки не являются "текстом программы". Но если вы #include
заголовок, не станет ли он частью текста программы? Это немного вводит в заблуждение.
Итак, что такое заголовок? Что такое исходный файл?