more with char arrays and class functions

petedd:
I always appreciate your insights Pieter. Could you tell me more on why macros “are evil”?

Because macros are completely invisible to the compiler, they are just "stupid" text search and replace operations that happen before your code is passed to the compiler. This means that there are no checks, no type system, etc.

It also makes it hard for the programmer to see what's going on, having to expand possibly multiple layers of macros in your head. It's easy to forget to add parentheses around the operands or results, etc.

Finally, macros aren't scoped. If two libraries happen to use the same macro name, everything breaks, even if the macro is only used at a local scope or inside of a namespace block. This is a consequence of macros being invisible to the compiler.
If you use constants, they follow the scope and namespace rules of the language, and they won't clash if two constants in a different scope or namespace happen to have the same name.

Do I burn any more or less memory space by using constants and enumerated instead?

Macros will not save memory. Modern compilers are smart, if you're not using a constant, it'll optimize it out, it doesn't matter if it's a macro or a const/constexpr variable.