¿Por qué simplemente no escribimos?
while (RXC == 0);
Porque "RXC" es una constante 7. ¿Cuál es el número del bit RXC en el registro UCSRA? Entonces, mientras () saldrá inmediatamente, porque se expandirá a
while (7 == 0);
Tenga en cuenta que le he dado un ejemplo para ATmega32. Para diferentes controladores, la macro "RCX" puede tener un valor diferente.
Y en caso de que se esté preguntando, "UCSRA" y "UDR" en su código también son dos definiciones de macro que hacen referencia a otra macro, _SFR_IO8.
ACTUALIZACIÓN
Por ejemplo, las macros:
#define RXC 7
#define UCSRA _SFR_IO8(0x0B)
transforme el código while (!(UCSRA & (1<<RXC)));
en
while (!(_SFR_IO8(0x0B) & 0x80));
Entonces la macro
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
transforma el código más adelante en
while (!(_MMIO_BYTE((0x0B) + __SFR_OFFSET) & 0x80));
Dado que _MMIO_BYTE y __SFR_OFFSET también son macros, el proceso continúa hasta que se procesan todas las directivas de macros. Al final te consigues un código que lee.
UCSRA registra y aplica la máscara para el bit # 7 en él.
La razón principal de todo esto es hacer que el código sea más portátil. Por ejemplo, al cambiar 0x0B en la macro UCSRA podemos acceder a los registros de UCSRA en diferentes controladores sin cambiar la dirección de registro en nuestro código.