Какво точно е изходният файл за стандарта 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)


Изходен файл е всеки текстов файл (или друг обект, специфичен за изпълнение, според отговора на Basile), съдържащ изходен код. Това конкретно включва както .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