Подтвердить что ты не робот

Может ли заголовок существовать без файла?

В C: Полная ссылка, Герберт Шильдт говорит, что

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

Как заголовок может существовать без файла? Какая тема этого отрывка? Поскольку расширение .h используется с заголовком.

4b9b3361

Ответ 1

Стандарт C делает разницу между заголовками и исходными файлами, на которые ссылаются директивы #include для предварительной обработки:

6.10.2 Включение исходного файла

Ограничения

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

Семантика

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

# include <h-char-sequence> new-line

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

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

# include "q-char-sequence" new-line

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

# include <h-char-sequence> new-line

с идентичной содержащейся последовательностью (включая > символы, если они есть) из исходной директивы.

Компилятор может реализовать схему, в которой стандартные заголовки фактически не хранятся как файлы в файловой системе. Но директива #include "filename.h" определяется как поиск сначала для файла в системном режиме, а затем поиск стандартных заголовков, как если бы директива была #include <filename.h>

Обратите внимание, что расширения файлов .c и .h являются чисто конвенцией для различения файлов, содержащих декларации и файлы, содержащие фактические определения кода и данных. Ничто в Стандарте не делает это соглашение обязательным, помимо имен, используемых для стандартных заголовков. Некоторые люди используют другие соглашения с разными расширениями или вообще не имеют никаких расширений для конкретных потребностей, но подавляющее большинство программистов C рассматривают это как плохую практику.

Шафик Ягмур предоставил цитату из Обоснования C99 в ответ на аналогичный вопрос, который наводит на мысль о намерениях комитетов по этому вопросу: fooobar.com/questions/451728/...

Ответ 2

В стандарте C явно говорится, что заголовок является файлом, поэтому я не думаю.

6.10.2 Включение исходного файла

Директива

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

Однако то, что считается файлом для данной системы, определяется реализацией. Теоретически это мог быть аппаратный порт, труба или какая-то другая глупость. Большинство основных ОС имеют возможность обрабатывать порты или каналы в виде файлов (например, в Windows, файлы и аппаратные порты открыты с той же функцией.)

Ответ 3

Для гипотетического компилятора C не требуется файловая система. Он может обрабатывать директиву #include иначе:

  • он мог запросить базу данных (IIRC, какой-то компилятор IBM сделал это в 1980-х годах, в базе данных был кеш AST)

  • он может обрабатывать стандарт, в противном случае, то есть когда он сталкивается с #include <stdio.h> - в определенных условиях - изменяет свое внутреннее состояние (на что требуется стандарт) без доступа к любому заголовочному файлу. Другими словами, стандартные заголовки могут быть "встроены".

На практике все компиляторы C, которые я знаю сегодня, используют файловую систему для заголовков. Но читайте о прекомпилированных заголовках в GCC.

BTW, упоминание "файла заголовка" в спецификации C11 n1570 не требует файловой системы (как в обычных ОС).