Pedantic: Что такое исходный файл? Что такое заголовок?

Для целей этого вопроса меня интересует только C ++, совместимый со стандартами, а не C или C ++ 0x, и никакие подробности, связанные с реализацией.

Время от времени возникают вопросы относительно различий между #include "" и #include . Аргумент обычно сводится к двум различиям:

  1. Определенные реализации часто ищут разные пути для двух форм. Это зависит от платформы и не входит в сферу применения этого вопроса.
  2. Стандарт гласит #include для «заголовков», тогда как #include "» для "исходный файл." Вот соответствующая ссылка:

ISO / IEC 14882: 2003 (E)

16.2 Включение исходного файла [cpp.include]

1 Директива #include должна идентифицировать заголовок или исходный файл, который может быть обработано реализацией.

2 Директива предварительной обработки в форме

 # include & lt h-char-sequence & gt new-line 
ищет последовательность мест, определенных реализацией, для заголовка , уникально идентифицируемого указанной последовательностью между разделителями & lt и & gt, и вызывает замена этой директивы всем содержимым заголовка. Как места определяются или как определяется заголовок, определяется реализацией.

3 Директива предварительной обработки в форме

 # include "q-char-sequence", новая строка 
вызывает замену этой директивы всем содержимым исходного файла , идентифицируемого указанной последовательностью между "разделителями". исходный файл ищется способом, определяемым реализацией. Если этот поиск не поддерживается или поиск не удался, директива обрабатывается повторно, как если бы она читалась
 # include & lt h-char-sequence & gt new-line 
с идентичной содержащейся последовательностью (включая> символы, если есть) из исходной директивы.

(Акцент в приведенной выше цитате - мой.) Похоже, это различие заключается в том, что Стандарт намеревается провести различие между «заголовком» и «исходным файлом», но нигде документ не определяет ни этих терминов, ни разница между ними.

Есть еще несколько мест, где даже упоминаются заголовки или исходные файлы. Несколько:

158) Заголовок не обязательно является исходным файлом, и последовательности, разделенные именами заголовков, не обязательно являются допустимыми именами исходного файла (16.2).

Кажется, подразумевается, что заголовок может не находиться в файловой системе, но это не говорит о том, что исходные файлы тоже.

2 Лексические соглашения [lex]

1 Текст программы хранится в единицах, называемых исходными файлами в этом международном стандарте. Исходный файл вместе со всеми заголовками (17.4.1.2) и включенными исходными файлами (16. 2) через директиву предварительной обработки #include , за исключением любых строк исходного текста, пропущенных любой из директив предварительной обработки условного включения (16.1), называется единицей трансляции. [Примечание: программу на C ++ не обязательно нужно переводить одновременно. ]

Это наиболее близкое мне определение к определению, и, похоже, оно подразумевает, что заголовки не являются «текстом программы». Но если вы #include заголовок, не станет ли он частью текста программы? Это немного вводит в заблуждение.

Так что же такое заголовок? Что такое исходный файл?

16
задан Community 23 May 2017 в 10:30
поделиться

5 ответов

Разве это не говорит о том, что заголовок может быть реализован как исходный файл, но опять же не может быть? Что касается «что такое исходный файл», то для стандарта кажется очень разумным не разъяснять это, учитывая множество способов реализации «файлов».

4
ответ дан 30 November 2019 в 22:43
поделиться

Я считаю, что стандартные заголовки, включенные с помощью <> угловых скобок, не обязательно должны быть реальными файлами в файловой системе; например, реализация может свободно включить набор "встроенных" операций, обеспечивающих функциональность iostream, когда она видит #include .

С другой стороны, "исходные файлы", включенные с #include "xxx.h", должны быть буквальными файлами, расположенными в файловой системе, поиск которых осуществляется каким-либо способом, зависящим от реализации.

Edit: чтобы ответить на ваш конкретный вопрос, я полагаю, что "заголовки" ограничены только теми #includeспособными средствами, указанными в стандарте: iostream, vector и друзья - или реализацией как расширения стандарта. "Исходные файлы" - это любые нестандартные средства (как файлы .h и т.д.), которые программист может написать или использовать.

8
ответ дан 30 November 2019 в 22:43
поделиться

Хммм ...

Я случайно понял, что различие между <> includes и "" includes унаследовано от c и (хотя и не определено стандартами) de facto значение было that <> искал пути для заголовков, предоставленных системой и компилятором, а "" также искал локальные и пользовательские пути.

Приведенное выше определение в некотором смысле согласуется с таким использованием, но ограничивает использование «заголовка» вещами, предоставленными компилятором или системой исключительным кода, предоставленным пользователем, даже если они имеют традиционная форма «интерфейс в заголовке».

Во всяком случае, очень интересно.

0
ответ дан 30 November 2019 в 22:43
поделиться

Стандартные заголовки (string, iostream) не обязательно должны быть файлами с такими именами или вообще файлами. До тех пор, пока, как вы говорите

#include <iostream>

определенный список деклараций входит в область действия, стандарт удовлетворяется. То, как именно это происходит, является деталью реализации. (когда Стандарт был написан, DOS могла обрабатывать только имена файлов 8.3, но некоторые имена стандартных заголовков были длиннее этого)

.
2
ответ дан 30 November 2019 в 22:43
поделиться

Как говорится в ваших цитатах: заголовок - это что-то, включенное с помощью <>, а исходный файл - это компилируемый файл или что-то, включенное с помощью "". Откуда именно берется их содержимое, и какие нестандартные заголовки доступны, зависит от реализации. Стандарт указывает только то, что определено, если вы включите стандартные заголовки.

По соглашению, заголовки обычно являются общесистемными вещами, а исходные файлы обычно локальны для проекта (для некоторого определения проекта), но стандарт мудро не увязает ни в чем, связанном с организацией проекта; он просто дает очень общие определения, совместимые с такими соглашениями, оставляя детали на усмотрение реализации и/или пользователя.

Почти весь стандарт имеет дело с программой после ее предварительной обработки, когда нет таких вещей, как исходные файлы или заголовки, только единицы перевода, которые определяет ваша последняя цитата.

2
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: