This is a classical issue with C and C++ probably with other language also. Which one best i.e. to use #define or enum or constant.
Lets analyse all three under the following point:
1. #define values are replaced by the pre-processor with the value they are declared as, so in the debugger, it only sees the value, not the #defined name
2. The compiler stores enum information in the binary so a debugger can show the enum name
3. const is allocated with a storage so can be accessed by the deugger.
1. #define has no storage allocation.as it is pre-processor action
2. enum is compile time constant with no storage allocation.
3. const is allocated with a storage (depending on whether it is optimized away by the compiler with constant propagation)
1. enum and const respects scope and is type-safe.
2. a const variable can not be used as a dimension of an array where as enum and #define can be used. (C99 is exception)
3. If you need to pass a pointer you can use only const.
4. switch can work with enum or #define but not with const.
So in summary it is context dependent whether to use const or enum or #define. I just tried to summarize my learning, comments are welcome.