Для "стандартного компилятора":
5.2.4.1: «Пределы перевода»
Реализация должна быть в состоянии
перевести и выполнить хотя бы один
программа, которая содержит хотя бы один
экземпляр каждого из следующих
Пределы
...
4095 макро идентификаторов одновременно
определяется в одной предварительной обработке
переводческий блок
Обратите внимание на несколько странный способ сформулировать требование. Реализации могут удовлетворить это, имея единственную "золотую программу", которую они распознают и скомпилируют как особый случай, хотя это будет похоже на фальсификацию тестов. На практике вы можете прочитать стандарт так, как если бы ваша реализация накладывала ограничение, отличное от доступной памяти, тогда этот предел должен быть не менее 4095. За пределами 4095 вы полагаетесь на поведение, зависящее от реализации, в некоторой степени.
Некоторые компиляторы (Microsoft) накладывают некоторые ограничения реализации, которые меньше, чем указано в стандарте. Я думаю, что они перечислены где-то на MSDN, но, возможно, только для C ++. Что касается C, то, поскольку я цитирую C99, он, в любом случае, может не относиться к MSVC.
В частности, для GCC и MSVC не должно быть слишком сложно проверить, накладывает ли данная реализация произвольный лимит, возможно, проще, чем найти его документированным :-) Автоматически генерировать файлы, содержащие только большие списки * 1021. * посмотрите, что из них делает препроцессор.