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

StackOverflow https://stackoverflow.com/questions/3469588

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

  1. Конкретные реализации часто ищут разные пути для двух форм. Это специфична платформа, а не в объеме этого вопроса.
  2. Стандарт говорит #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 Заголовок, не станет частью текста программы? Это немного вводит в заблуждение.

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

Это было полезно?

Решение

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

Другие советы

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

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

Редактировать: ответить на ваш конкретный вопрос, я считаю, что «заголовки» ограничены только тем #includeСпособность Услуги, указанные в стандарте: iostream, vector и друзья --- или по реализации как расширения к стандарту. «Исходные файлы» будут любые нестандартные объекты (как .h Файлы и т. Д.) Программист может писать или использовать.

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

#include <iostream>

Определенный список деклараций приходит в объем, стандарт удовлетворен. Точно то, как это происходит, это деталь реализации. (Когда стандарт был написан, DOS может обрабатывать только 8,3 имена файлов, но некоторые из стандартных имен заголовков были длиннее этого)

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

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

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

Хм...

Мое случайное понимание было то, что различие между <> включает в себя и включает в себя, было унаследовано от C и (хотя и не определяется стандартами) де-факто Значение было то, что <> искали пути для системы и компилятора, прилагаемые заголовками и «», также искали локальные и пользовательские указанные пути.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top