Переопределение макросов работает в некоторых компиляторах, но не в других. Что решает это?

#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))
  

Большинство компиляторов, которые я пробовал, принимают это. Итак, вопросы:

  1. Почему компилятор CCS не работает с этим? (технически, препроцессор)
  2. Есть ли 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 очень чистое. Не было бы лучше определить встроенную функцию или написать макрос по-другому? Текущая реализация подвержена ошибкам. Используйте макросы с осторожностью.