Педантичность: что такое исходный файл? Что такое заголовок?
Для целей этого вопроса меня интересует только стандартно-совместимый С++, а не 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
заголовок, не станет ли он частью текста программы? Это немного вводит в заблуждение.
Итак, что такое заголовок? Что такое исходный файл?
Ответы
Ответ 1
Разве это не означает, что заголовок может быть реализован как исходный файл, но опять же может не быть? что касается "то, что является исходным файлом", кажется очень разумным, что стандарт не должен указывать на это, учитывая множество способов реализации "файлов".
Ответ 2
Мое прочтение состоит в том, что стандартные заголовки, включенные с помощью угловых скобок <>
, не обязательно должны быть фактическими файлами в файловой системе; например реализация будет бесплатной, чтобы включить набор "встроенных" операций, обеспечивающих функциональность iostream
, когда он видит #include <iostream>
.
С другой стороны, "исходные файлы", включенные в #include "xxx.h"
, предназначены для того, чтобы быть литеральными файлами, находящимися в файловой системе, которые искали в зависимости от реализации.
Изменить: чтобы ответить на ваш конкретный вопрос, я считаю, что "заголовки" ограничены только теми #include
возможностями, указанными в стандарте: iostream
, vector
и друзьями --- или реализацией в качестве расширений к стандарту. "Исходными файлами" будут любые нестандартные средства (в виде файлов .h
и т.д.) Программист может писать или использовать.
Ответ 3
Стандартные заголовки (строка, iostream) необязательно должны быть файлами с этими именами или даже файлами. Пока вы говорите
#include <iostream>
в сферу применения входит определенный список объявлений, стандарт удовлетворен. Точно как это происходит, это деталь реализации. (когда был написан стандарт, DOS могла обрабатывать только 8,3 имени файла, но некоторые из стандартных имен заголовков были длиннее, чем это)
Ответ 4
Как утверждают ваши цитаты: заголовок - это что-то, включенное с помощью <>
, а исходный файл - это скомпилированный файл или что-то в нем с помощью ""
. Именно там, где их содержимое и какие нестандартные заголовки доступны, зависит от реализации. Все стандартные значения - это то, что определено, если вы включаете стандартные заголовки.
По соглашению заголовки обычно являются общесистемными, а исходные файлы обычно являются локальными для проекта (для некоторого определения проекта), но стандарт мудро не увязнет во всем, что связано с организацией проекта; он просто дает очень общие определения, которые совместимы с такими соглашениями, оставляя детали для реализации и/или пользователя.
Почти все стандартные сделки с программой после ее предварительной обработки, и в это время нет таких вещей, как исходные файлы или заголовки, только единицы переводов, которые определяет ваша последняя кавычка.
Ответ 5
Хммм...
Мое случайное понимание заключалось в том, что различие между включенными < > include и "было унаследовано от c и (хотя и не определено стандартами), фактическим значением было то, что < > найденные пути для системных и компиляторов предоставили заголовки и" " также искали локальные и пользовательские пути.
Вышеприведенное определение, похоже, в каком-то смысле согласуется с этим использованием, но ограничивает использование "заголовка" вещами, предоставляемыми компилятором или системой, исключающей код, предоставленный пользователем, даже если у них есть традиционный "интерфейс" форма заголовка.
Во всяком случае, очень интересно.