C++ - enum vs. const vs. #define
c++, constants, enumeration, macros
Solution
Consider this code,
#define WIDTH 300
enum econst
{
eWidth=300
};
const int Width=300;
struct sample{};
int main()
{
sample s;
int x = eWidth * s; //error 1
int y = WIDTH * s; //error 2
int z = Width * s; //error 3
return 0;
}
Obviously each multiplication results in compilation-error, but see how the GCC generates the messages for each multiplication error:
prog.cpp:19: error: no match for ‘operator*’ in ‘eWidth * s’ prog.cpp:20: error: no match for ‘operator*’ in ‘300 * s’ prog.cpp:21: error: no match for ‘operator*’ in ‘Width * s’
In the error message, you don't see the macro `WIDTH` which you've `#defined`, right? That is because by the time GCC makes any attempt to compile the line corresponds to second error, it doesn't see `WIDTH`, all it sees only 300, as before GCC compiles the line, preprocessor has already replaced `WIDTH` with 300. On the other hand, there is no any such thing happens with enum `eWidth` and const `Width`.
See the error yourself here : http://www.ideone.com/naZ3P
Also, read `Item 2 : Prefer consts, enums, and inlines to #defines` from Effective C++ by Scott Meyers.
Problem
At the end of the article here: http://www.learncpp.com/cpp-tutorial/45-enumerated-types/, it mentions the following: Finally, as with constant variables, enumerated types show up in the debugger, making them more useful than #defined values in this regard. How is the bold sentence above achieved? Thanks.