The macro generates code for two functions: EnumToString() and StringToEnum().
Notes:
1. this macro creates a scoped enumeration (enum class) which favors code
readability;
2. this implementation does not support assignment of values to enumerators
and also does not support multiple enumerators with the same value. The first
enumerator value is 0, the next is 1, and so on. Nevertheless, it is still
useful for many cases;
3. if an invalid string is passed to StringToEnum() the program will be
aborted and an error message describing the error will be displayed in the
standard output.