Что такое исходный файл для стандарта C11

У меня есть сомнения по поводу предложения в этом абзаце стандарта C11:

5.1.1.1 Структура программы

Программу на C не нужно переводить все одновременно. Текст программы хранится в единицах, называемых в настоящем стандарте исходными файлами (или файлами предварительной обработки). Исходный файл вместе со всеми заголовками и исходными файлами, включенными с помощью директивы предварительной обработки #include, известен как единица трансляции предварительной обработки.

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

Так является ли исходный файл другим объектом по отношению к заголовочному файлу или исходный файл включает в себя и то, и другое?


c c11
person xdevel2000    schedule 17.11.2014    source источник
comment
это просто говорит о том, что в исходный файл может быть включено несколько других файлов, заголовков, других исходных файлов, и как только все это было включено, это PTU.   -  person Keith Nicholas    schedule 17.11.2014
comment
Итак, вам кажется, что исходный файл - это другой объект по отношению к заголовочному файлу...   -  person xdevel2000    schedule 17.11.2014


Ответы (3)


исходный файл — это любой текстовый файл (или другой объект, зависящий от реализации, согласно ответу Базиля), содержащий исходный код. В частности, это относится к файлам .c и .h. Он также может включать файлы с другими суффиксами, например файлы препроцессора или сгенерированного кода.

Когда вы берете какой-то исходный файл, фактически переданный компилятору (обычно только .c файлов), этот файл вместе с (транзитивным закрытием) всего, что он #includes, образует единицу перевода.

Итак: каждая единица перевода состоит из исходных файлов.

Но: не каждый исходный файл является отправной точкой единицы перевода.

person Useless    schedule 17.11.2014

Педантично исходный файл (в смысле стандарта C99 или C11) даже не обязательно является файлом (в смысле операционной системы). Соответствующая реализация может прочитать «исходный файл» из базы данных или некоторую постоянную строку внутри какой-либо программы.

По слухам, проприетарный компилятор IBM 1990-х годов (VisualAge???) источник для компиляции из некоторой базы данных. Сегодня tinycc также предоставляет libtcc библиотеку с функцией tcc_compile_string для компиляции строки. TinyCC очень быстро компилируется в медленный машинный код.

На практике часто существует несколько исходных файлов (например, файлы .h и .c), которые обрабатываются в рамках одной компиляции или единицы перевода. .

IIUC, самое забавное в стандартах C то, что они не предполагают наличие файловой системы для реализации. Я считаю, что стандарт даже не требует компьютера; вы можете внедрить стандарт неэтично, используя группу людей-рабов, но это аморально и неэффективно.

person Basile Starynkevitch    schedule 17.11.2014

Термин исходный файл (или файл предварительной обработки) относится как к .c исходному файлу, так и к .h заголовку. Стандарт C не различает их как таковые.

Это явно упоминается в книге К. Н. Кинга "Программирование на C: современный подход" (раздел 15.2).

person Grzegorz Szpetkowski    schedule 17.11.2014
comment
Это интересный момент; в стандарте также говорится: заголовок не обязательно является исходным файлом, а последовательности с разделителями ‹ и › в именах заголовков не обязательно являются действительными именами исходных файлов.. ... - person xdevel2000; 17.11.2014