Стандарт C определяет восемь этапов перевода:
Физические исходные многобайтовые символы и последовательности триграфа сопоставляются с символами исходного набора символов.
Каждый backsla sh, за которым следует новая строка, удаляется (объединяя две строки).
Исходные символы сгруппированы в токены предварительной обработки, и каждая последовательность символы пробела заменяются одним пробелом, за исключением того, что сохраняются новые строки.
Выполняются директивы предварительной обработки и операторы _Pragma, а вызовы макросов расширяются.
Исходные символы в строках и символьные константы преобразуются в набор символов выполнения.
Объединенные строковые литералы объединяются.
Каждый токен предварительной обработки преобразуется в токен грамматики, а пробелы, разделенные пробелами, отбрасываются. Полученные токены анализируются и транслируются (компилируются).
Все внешние ссылки разрешены (программа связана).
Разрешение константы Размеры массива, таким образом, происходят в фазе 7. Тем не менее, фазы в основном являются концептуальными. Этапы объясняют, как понимается язык C, а не то, как должен выполняться компилятор.
Для компиляторов, которые создают объектные модули, размеры массивов с длительностью хранения stati c обязательно разрешаются до того, как информация объекта написано, так как размер массива влияет на компоновку данных, которая должна быть полностью описана в объектном модуле. Обработка размеров массивов с автоматическим c сроком хранения теоретически может быть оставлена до тех пор, пока программа фактически не выполнит код, который нуждается в них, поскольку это обязательно относится к массивам переменной длины. Однако это было бы расточительно, так как постоянные размеры массива легко обрабатываются во время компиляции, и предпочтительно, чтобы необходимые значения (например, объем стекового пространства, резервируемого при входе в функцию), скорее рассчитывались во время компиляции чем во время исполнения. Таким образом, можно ожидать, что обычные компиляторы разрешают все постоянные размеры массива во время компиляции (то есть до завершения объектного модуля для модуля перевода) и концептуально после этапа 6.
Дополнительная идентификация точек в процессе перевода, где массив Разрешенные размеры зависят от внутренних деталей реализации компилятора (или реализации C в целом).