C17 Раздел 5.2.4.1, пункт 1, перечисляет ряд минимальных лимитов перевода.Это означает, что реализациям разрешено, но не обязательно, превышать эти пределы.В приведенной ниже цитате я пропустил пару ссылок на сноски и выделил одну, которая, скорее всего, имеет отношение к этому вопросу.
Реализация должна иметь возможность переводить и выполнять по крайней мере одну программукоторый содержит хотя бы один экземпляр каждого из следующих ограничений:
- 127 уровней вложенности блоков
- 63 уровня вложенности условного включения
- 12 указателей, массиви деклараторы функций (в любых комбинациях), изменяющие арифметический, структурный, объединенный или недействительный тип в объявлении
- 63 уровня вложенности объединенных в скобки деклараторов в полном деклараторе
- 63 уровня вложенностивыражений в скобках внутри полного выражения
- 63 значимых начальных символа во внутреннем идентификаторе или имени макроса (каждое универсальное имя или расширенный исходный символ считается одним символом)
- 31 значащийначальные символы во внешнем идентификатореfier (каждое имя универсального символа, указывающее короткий идентификатор 0000FFFF или менее, считается 6 символами, каждое имя универсального символа, указывающее короткий идентификатор 00010000 или более, считается 10 символами, и каждый расширенный исходный символ считается тем же числом символов, что исоответствующее имя универсального символа, если оно есть)
- 4095 внешних идентификаторов в одной единице перевода
- 511 идентификаторов с областью блока, объявленной в одном блоке
- одновременно определены 4095 макро идентификаторовв одной единице преобразования предварительной обработки
- 127 параметров в одном определении функции
- 127 аргументов в одном вызове функции
- 127 параметров в одном макроопределении
- 127 аргументов в одном вызове макроса
- 4095 символов в строке логического источника
- 4095 символов в строковом литерале (после конкатенации)
- 65535 байт в объекте (втолько для размещенной среды)
- 15 уровней вложенности для # включенных файлов
- 1023 метки регистра для оператора переключения (исключая метки для любых вложенных инструкций переключения)
- 1023члены в одной структуре или объединении
- 1023 константы перечисления в одном перечислении
- 63 уровня вложенных определений структуры или объединения в одном списке struct-объявление
Соответствие количества символов в строке логического источника происходит потому, что раскрытие макроса будет происходить в одной строке логического источника.Например, если \
используется в определении макроса для указания многострочного макроса, все части объединяются в одну строку источника.Это требуется в разделе 5.1.1.2, пункт 1, второй пункт.
В зависимости от того, как определен макрос, на него могут влиять и другие ограничения.
Практически, все реализации (компиляторы и их препроцессоры) выходят за эти пределы.Например, допустимая длина строки логического источника для компилятора gnu определяется доступной памятью.