Есть ли ограничение на число #defines, которые могут обрабатывать препроцессоры gcc и VC ++? - PullRequest
6 голосов
/ 15 января 2011

При обсуждении возможностей проектирования для проекта, в котором нужно определить очень большое число констант и шаблонов битов, возник вопрос о том, сколько #defines может обрабатывать стандартный компилятор? Я предполагаю, что это очень большое число, но нам было любопытно узнать, существует ли фактическая верхняя граница.

Ответы [ 3 ]

8 голосов
/ 15 января 2011

Для "стандартного компилятора":

5.2.4.1: «Пределы перевода»

Реализация должна быть в состоянии перевести и выполнить хотя бы один программа, которая содержит хотя бы один экземпляр каждого из следующих Пределы

...

4095 макро идентификаторов одновременно определяется в одной предварительной обработке переводческий блок

Обратите внимание на несколько странный способ сформулировать требование. Реализации могут удовлетворить это, имея единственную "золотую программу", которую они распознают и скомпилируют как особый случай, хотя это будет похоже на фальсификацию тестов. На практике вы можете прочитать стандарт так, как если бы ваша реализация накладывала ограничение, отличное от доступной памяти, тогда этот предел должен быть не менее 4095. За пределами 4095 вы полагаетесь на поведение, зависящее от реализации, в некоторой степени.

Некоторые компиляторы (Microsoft) накладывают некоторые ограничения реализации, которые меньше, чем указано в стандарте. Я думаю, что они перечислены где-то на MSDN, но, возможно, только для C ++. Что касается C, то, поскольку я цитирую C99, он, в любом случае, может не относиться к MSVC.

В частности, для GCC и MSVC не должно быть слишком сложно проверить, накладывает ли данная реализация произвольный лимит, возможно, проще, чем найти его документированным :-) Автоматически генерировать файлы, содержащие только большие списки * 1021. * посмотрите, что из них делает препроцессор.

2 голосов
/ 15 января 2011

Я никогда не слышал о том, чтобы кто-нибудь заканчивался.Когда-либо.

0 голосов
/ 15 января 2011

Препроцессор C не раскрывает #define до того, как он будет фактически использован. Таким образом, в типичной реализации единственным ограничением, с которым вы можете столкнуться, является память для хранения всего этого. Но эта память для хранения внутреннего представления макросов будет в основном максимально пропорциональна размеру файлов, которые читает компилятор.

(Ну, вы также можете сделать несколько включений файлов ...)

Полагаю, что вы можете выполнить разборку предварительной обработки, развернув глубоко вложенные макросы. Что-то вроде

#define EXP1(X) X X
#define EXP2(X) EXP1(X) EXP1(X)
#define EXP3(X) EXP2(X) EXP2(X)
.
.
#define EXP64(X) EXP63(X) EXP63(X)
EXP64(A)

должен сделать трюк, так как он дает вам 2 ^ 64 копии A, или около того. AFAIR, эти макроопределения находятся даже в пределах, установленных стандартом.

...