First, macros(# define) don't observe the usual scope rules. If you declare a macro in a local scope, don't expect it to stay there. Second, some compilers don't preserve macro names for use by symbolic debuggers.
Avoiding macros leaves you with a choice of enumeration...