Привет всем! Вопросы по большй части к тем, что много пишет / писАл на С и использует при этом возможности препроцессора. Предположим, определены такие макросы: Код (Text): #define f(a) f(2 * (a)) Далее, где-то есть вызов: Код (Text): f(f(z)) Это будет разложено в: Код (Text): f(2 * (f(2 * (z)))) Главный смысл здесь - макрос вызавается как бы рекурсивно. Вопрос: насколько часто подобные вещи встречаются / использубтся в реальных ситуациях? Я сам со сложными конструкциями не сталкивался, и насколько знаю, использование их не приветствуется. Действительно ли это так? Например, такой "простой" код ввергает препроцессор LCC в глубокую задумчивость (из которой он выходит лишь тогда, когда заканчивается память у ОС): Код (Text): #define g(a) #define t(a) a t(g)(0) Ещё, может быть есть у кого примеры каких-то реальнах макросов, которые сложнее, чем то, что можно встретить где-нибудь в инклудах у микрософта. "Громоздкие" конструкции не интересуют - дело именно во всевозможных трюках со скобочками и т.п. Заренее благодарен. ЗЫ Всё это нужно для тестирования / написания препроцессора имеющего некоторую совместимость с сишным. ЗЫЫ Руководствуюсь ansi_iso_iec_14882_1998.pdf - описание там несколько расплывчатое, но как я понял более точного / подробного нет?
На Си писал много Но макросами по возможности не пользовался. У Голуба много написано. В С++ вместо макросов надо юзать темплейты. Вот, собственно, и все размышления.
На С писал, можно даже, наверное, сказать что 3 года это много, но большие или немножко нестандартные макросы не использовал, ибо изврат.
Да, я примерно такой ответ и ожидал Но препроцессор этот планируется использовать не с Си, а с ассемблером, а поэтому без макросов не обойтись. Основная цель - возможность использовать готовые include, где куча всяких простых макроопределений, вроде Код (Text): #define SW_HIDE 0 #define CreateDialogA(hInstance, lpName, hWndParent, lpDialogFunc) \ CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0L) От полной совместимости я отказался, так как необходима возможность "многоразового" переопределения макросов. Из-за этого появляются некоторые проблемы, например: Код (Text): #define f(a) f(2 * (a)) f(f(z)) у меня преобразуется в: f(2 * (f(z))) (из-за того, что макросы можно переопределять, некоторые проблемы с выходом из рекурсии получаются при строгом следовании Си стандарту) Сейчас для решения проблемы у меня можно сделать так Код (Text): #define f(a) f(2 * (a)) #define f(a) f(2 * (a)) f(f(z)) тогда всё будет нормально развёрнуто (т.е. как в Си). То есть, при написании своих макросов всё эти нюансы можно учитывать (it's not a bug, it's a feature , но хочется достичь наилучшего компромисса в совместимости с теми макросами, которые уже есть. Поэтому у меня размышления длятся несколько дольше