MISRA-C считает глупой идею использовать одну и ту же константу препроцессора дважды в одном и том же макросе, где она расширяется в одном случае, но не расширяется в другом.
В вашем макросе val##_MASK
не будет расширен, поэтому вы получите INIT_A_MASK
. Но позже в том же макросе val
также расширяется и заменяется на ((A) | (1UL << 15))
.
Единственное приемлемое решение - переписать весь этот сумасшедший код с нуля и избавиться от всякого использования секретных языков макросов.
Например, что означает #define A (1UL < 10)
? Я предполагаю, что <<
был предназначен. Если бы не секретный макроязык, такие ошибки легко найти. Но вместо этого вы внедрили трудно обнаруживаемую ошибку в ваше приложение.