#c #macros
#c #макросы
Вопрос:
Я написал 2 макроса и протестировал код в онлайн-компиляторе, но при переходе к компилятору CCS PIC 4.032 выдает ошибку «Макрос определяется рекурсивно».
#define MIN_VALUE_2(a, b) (((a) < (b)) ? a : b)
#define MIN_VALUE_4(a, b, c, d) MIN_VALUE_2(MIN_VALUE_2(a, b), MIN_VALUE_2(c, d))
Большинство компиляторов, которые я пробовал, принимают это. Итак, вопросы:
- Почему компилятор CCS не работает с этим? (технически, препроцессор)
- Есть ли 2 этапа, необходимые для выполнения замены? Это результат первого этапа? Или как работает препроцессор?
#define MIN_VALUE_4(a, b, c, d) (((MIN_VALUE_2(a, b)) < (MIN_VALUE_2(c, d))) ? MIN_VALUE_2(a, b) : MIN_VALUE_2(c, d))
Комментарии:
1. Я не вижу рекурсивного определения макроса. Я бы обсудил это с поставщиком компилятора.
2. Использование имени макроса в его собственном определении не является ошибкой в C, поэтому компилятор, который жалуется на это, определенно вызывает подозрение. Но ни одно из этих определений не является рекурсивным. На что жалуется компилятор?
3. Возможно, не связано: я бы добавил больше круглых скобок вокруг a и b в
#define MIN_VALUE_2(a, b) (((a) < (b)) ? (a) : (b))
4. Вероятно, просто еще один день в удивительном мире вонючих компиляторов встроенных систем.
5. Первый вопрос немного странный. Я не уверен, какого ответа вы ожидаете. В любом случае, разрешено это стандартом C или нет, правильно или неправильно этот компилятор выдает ошибку, я не думаю, что определение
MIN_VALUE_4
очень чистое. Не было бы лучше определить встроенную функцию или написать макрос по-другому? Текущая реализация подвержена ошибкам. Используйте макросы с осторожностью.