Auf strings kann man in C/C++ nicht switchen. Das geht u.a. in C# (was mich seht gefreut hat als ich es entdeckt habe) und in Java seit Version 7.
Du kannst if/else Blöcke und strcmp() verwenden. Ist aber generell keine so gute Idee, da strings relativ viel RAM brauchen. Wieso gehen enums hier nicht?
Ich denke, es geht dem TE hauptsächlich um eine nachvollziehbarere Möglichkeit, den Code zu lesen. Mache lieber ein paar Kommentare mehr, die fressen dir den RAM nicht auf
Dann mach lieber Kommentare. Nicht dass dein Sketch nachher hinfällig ist, weil du deinen kompletten RAM aufgebraucht hast.
Ob nun 10 Kommentaren Zeilen oder 500 spielen für den Kompiler keiner Rolle.
Defines/Makros sind weit verbreitet, aber haben das Problem, dass es eben nur Text-Ersetzungen vor dem Compilieren sind. Es findet also keinerlei Überprüfung statt. Das kann zu merkwürdigen Fehlern führen. Außerdem halten defines keinen Gültigkeitsbereich/Scope ein, egal wo sie stehen. Heute wird deshalb oft davon abgeraten.
"const" Konstanten werden dagegen wie normale Variablen behandelt, und Compiler (gerade im Embedded Bereich) sind so intelligent, dass sie in den meisten Fällen die Konstanten direkt ins ROM schreiben wenn es möglich ist. Es wird also i.d.R. kein RAM Speicher gebraucht. Das ist aber nicht 100% garantiert.
Bei enums ist man sicherer, dass kein RAM für die Deklaration gebraucht wird.
Das ist auch historisch gewachsen. Const in C++ ist was anderes als in C. Die ganze Makro Geschichte hat sich in C eingebürgert und ist dann als "Tradition" erhalten geblieben.
Noch ein Fallstrick bei #define
Der Preprozzessor tauscht alle Strings aus unabhängig ob es Texte, Variablen oder Funktionen sind.
Dadurch kann es passieren daß ein Sketch nicht mehr funktioniert bzw ein falscher Text ausgegeben wird.
Grüße Uwe