Когда вы делаете (0x8020##4+n)
, он анализируется как эти токены: "(", "0x8020" ## "4", "+", "n", ")".
После вставки "0x8020" и "4" вы получите ( 0x80204 + n )
. Это на самом деле не добавляет n
перед вставкой. (А как это могло быть? Препроцессор не знает, что такое переменная, и думает, что «n» - это просто строка длиной 1)
Когда вы делаете ) ## 20
, вы получаете неверный токен ") 20", который не имеет смысла. Так что это по праву выдает ошибку.
Похоже, вы хотите заменить одну шестнадцатеричную цифру значением n
. Вы можете легко сделать это с помощью побитовых операций:
#define CHAN(n) (0x8020020 | ((4 + n) << 8))
// ^
(где сдвиг перемещает одну шестнадцатеричную цифру, представленную (4 + n), на второе место, и |
(поразрядно или) - заменяет указанное значение 0.