#define hat einen wichtigen Anwendungsfall: Debug-Ausgaben mit einer Zeile Ein- und Ausschalten
Darum geht es hier aber nicht. Er will zur Laufzeit umschalten. Also z.B. eine Funktion haben mit der man den gleichen Inhalt auf zwei Schnittstellen ausgeben kann (Einlesen von verschiedenen Quellen ginge genauso).
Den Vorteil sieht man vielleicht wenn man mal längere Ausgaben hat:
void print(Stream& stream, int x, int y, int z)
{
stream.print("X :"); stream.println(x);
stream.print("Y :"); stream.println(y);
stream.print("Z :"); stream.println(z);
}
Stream geht übrigens nicht nur mit Serial. Auch andere Klassen sind davon abgeleitet. Eine Funktion die eine Zeile von der seriellen Schnittstelle einlesen kann, geht auch ohne Änderungen für eine Zeile von einer SD-Karte