Обычно используемое определение единицы перевода - это то, что приходит после предварительной обработки (включения заголовочных файлов, макросы и т.д. вместе с исходным файлом). Это определение достаточно понятно и стандарт C, 5.1.1.1, C11, говорит:
Программа C не обязательно должна быть переведена одновременно. Текст программы хранится в единицах, называемых исходными файлами (или файлы предварительной обработки) в этом Международном стандарте. Исходный файл вместе со всеми заголовками и исходными файлами, включенными в директиву предварительной обработки
#include
, известен как блок перевода для предварительной обработки. После предварительной обработки блок перевода с предварительной обработкой называется единицей трансляции.
Более внимательно прочитайте первое предложение:
Программа C не обязательно должна быть переведена одновременно.
что подразумевает (для моего чтения), программа C может быть переведена в одно и то же время, не обязательно разбивая их на несколько исходных файлов предварительной обработки. Также в конце того же абзаца в стандарте говорится:
Единицы перевода могут быть переведены отдельно и затем связаны с производством исполняемой программы.
который может (и обычно) интерпретироваться как компиляция отдельных объектных файлов, а затем, наконец, связывать их для создания одной исполняемой программы. Однако, если можно сделать вопрос из приведенного выше утверждения и спросить: означает ли это, что реализация может рассматривать несколько исходных файлов как единую единицу перевода, особенно для вызова типа:
gcc file1.c file2.c -o out
где компилятор имеет доступ ко всему источнику?
В частности, если реализация рассматривает file1.c
+ file2.c
(выше) как единую единицу перевода, можно ли считать ее несоответствующей?