Я знаю, что там есть подводные камни (что надо объявить несколько макросов, нельзя просто склеить два токена).
Итак, имею следующие макроопределения в обоих проектах:
#define CONCAT(a, b) a ## b
#define CONCAT_EXPANDED(a, b) CONCAT(a, b)
А теперь код в одном проекте:
#define LED_PORT C
...
#define DDR(name) CONCAT(DDR, name)
...
#define LED_DDR DDR(LED_PORT)
Код в другом проекте:
#define GPS_USART USART2
...
#define RCC(name) CONCAT(RCC_, name)
...
#define GPS_USART_RCC RCC(GPS_USART)
В первом случае всё нормально компилируется, во втором препроцессор выдаёт ошибку при попытке использования:
ошибка: pasting "RCC_" and "(" does not give a valid preprocessing token
#define RCC(name) CONCAT(RCC_, name)
^
предупреждение: implicit declaration of function 'RCC_' [-Wimplicit-function-declaration]
#define RCC(name) CONCAT(RCC_, name)
^
Если скопипастить код из первого проекта во второй, то в нём ошибку препроцессора он вызывать не будет (точнее вызовет ошибку доступа к несуществующему символу DDRC, но это уже совсем другой разговор - проект то другой).
То есть вообще магия получается. Я в упор не вижу, чем эти два варианта кода отличаются. Точнее догадываюсь («USART2» - объявленное макроопределение, а «C» - нет), но не знаю как с этим бороться.